问题:
这两天iOS14对外开放,由于没有时间适配今天了一下90% 的崩溃都是14系统 然后赶紧做适配
发现大量的崩溃都是 应用程序调用 becomeFirstResponder 出现崩溃
友盟统计到报错日志
Thread 1: "[NSXPCConnection sendInvocation]: A NULL reply block was passed into a message meant to be sent over a connection. (syncToKeyboardState:completionHandler:)"
网上找了一堆
1.有说通知没有被释放的 然后我把所有关于键盘监听的代理都断点处理了 发现没有用
2.有的说是合并代码出现的 让新建一个工程然后代码拖进去,我一个15年的老项目 放弃了
中途测试过 通过try catch 去捕捉,因为我已经抓到崩溃问题是becomeFirstResponder,但是发现捕捉不到。 这个时候真的是失去信心了
这个问题卡了两天 崩溃率从0.1%到0.9% 吓死人了
刚开始的时候 由于异常抛出 直接没有被捕捉到 只有控制台有日志,日志又没有实质性的看法。
没有办法 先机智的创建了一个新的VC 里边放了一个UItextFile 测试一下 发现可以正常输入
那就 断定工程是没有问题的 肯定是某一行代码的问题 接下来就是二分法 注销一半代码 一行代码一行的看
最后发现工程里边 为了防止crash 导致app闪退,当时做了一个私有库,重写了
[INAvoidCrashHelperexchangeInstanceMethod:[selfclass]method1Sel:@selector(methodSignatureForSelector:)method2Sel:@selector(avoidCrashMethodSignatureForSelector:)];
[INAvoidCrashHelperexchangeInstanceMethod:[selfclass]method1Sel:@selector(forwardInvocation:)method2Sel:@selector(avoidCrashForwardInvocation:)];
发现崩溃是这个方法发生的instanceMethodSignatureForSelector 给她替换掉 methodSignatureForSelector
然后发现OK了 。