记录一次iOS 14 上非数字键盘第一相应者导致的崩溃问题
最近通过bugtags错误上报好几个iOS 14 上的崩溃问题,一直找不到崩溃的原因。崩溃信息如下:
Exception Codes: 0x00000000 at 0x0000000000000000
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '[NSXPCConnection sendInvocation]: A NULL reply block was passed into a message meant to be sent over a connection. (generateAutocorrectionsWithKeyboardState:candidateRange:requestToken:completionHandler:)'
根据错误日志也无法分享出具体错误信息,于是找了台设备升级到iOS 14 bata2,发现这在iOS 14上是一个必现的问题,只要是非数字键盘,在键盘成为第一响应者时就会导致崩溃。排查了很久,发现在 debug
模式下不会产生,在 release
模式下是必现,于是想到了 runtime
对错误信息的hook,尝试注释掉相关的runtime,果然不会导致崩溃问题,然后采用折半查找法,排查到是以前对一个键盘问题的处理方法导致的:
Method methodSignatureForSelector = class_getInstanceMethod(self, @selector(methodSignatureForSelector:));
Method customMethodSignatureForSelector = class_getClassMethod(self, @selector(customMethodSignatureForSelector:));
method_exchangeImplementations(methodSignatureForSelector, customMethodSignatureForSelector);
该方法在针对键盘的特定事件进行过重写,导致在iOS 14 上键盘成为第一响应者时导致崩溃。