-[UIThreadSafeNode canPerformAction:withSender:]:无法识别的选择器已发送到实例


9

我在我的iOS应用中遇到了崩溃。

Fatal Exception: NSInvalidArgumentException
0  CoreFoundation                 0x1b9079c30 __exceptionPreprocess
1  libobjc.A.dylib                0x1b8d940c8 objc_exception_throw
2  CoreFoundation                 0x1b8f77fc0 -[NSOrderedSet initWithSet:copyItems:]
3  CoreFoundation                 0x1b907e3d4 ___forwarding___
4  CoreFoundation                 0x1b9080570 _CF_forwarding_prep_0
5  UIKitCore                      0x1bcf33444 -[UIKeyboardImpl deleteForwardAndNotify:]
6  UIKitCore                      0x1bcf39154 __57-[UIKeyboardImpl acceptPredictiveInput:executionContext:]_block_invoke
7  UIKitCore                      0x1bcf5b0c8 -[UIKeyboardTaskExecutionContext returnExecutionToParentWithInfo:]
8  UIKitCore                      0x1bcf366ec __100-[UIKeyboardImpl addWordTerminator:afterSpace:afterAcceptingCandidate:elapsedTime:executionContext:]_block_invoke
9  UIKitCore                      0x1bcf5b0c8 -[UIKeyboardTaskExecutionContext returnExecutionToParentWithInfo:]
10 UIKitCore                      0x1bcf2bdc0 __55-[UIKeyboardImpl handleKeyboardInput:executionContext:]_block_invoke_2
11 UIKitCore                      0x1bcf5cd70 -[UIKeyboardTaskEntry execute:]
12 UIKitCore                      0x1bcf5b6d4 -[UIKeyboardTaskQueue continueExecutionOnMainThread]
13 libobjc.A.dylib                0x1b8d8faf0 -[NSObject performSelector:withObject:]
14 Foundation                     0x1b946ec10 __NSThreadPerformPerform
15 CoreFoundation                 0x1b8ff5260 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
16 CoreFoundation                 0x1b8ff51b4 __CFRunLoopDoSource0
17 CoreFoundation                 0x1b8ff4920 __CFRunLoopDoSources0
18 CoreFoundation                 0x1b8fef7ec __CFRunLoopRun
19 CoreFoundation                 0x1b8fef098 CFRunLoopRunSpecific
20 GraphicsServices               0x1c3159534 GSEventRunModal
21 UIKitCore                      0x1bd10f7ac UIApplicationMain
22 Haraj                          0x102fc6058 main + 15 (main.m:15)
23 libdyld.dylib                  0x1b8e6ef30 <redacted>

到目前为止,已经报告了100多起撞车事故。仅在iOS 12和iOS 13中会发生这种情况。

我无法找到这种情况如何发生以及如何重现。

堆栈跟踪不显示任何我的应用程序代码。

我已在此处上传了完整的崩溃报告。

任何帮助将不胜感激。

Answers:


10

这似乎是对与iOS文本输入中“转发删除”有关的古老错误的回归:http : //www.openradar.me/15114422

我相信由于新的“滑动输入”键盘,它已经退步了。

您有2种解决方案:

  1. 将不推荐使用的UIWebView升级到WKWebView
  2. hacky解决方案:UIThreadSafeNode在运行时插入缺少的选择器。

这是一个如何插入缺少的选择器的代码示例:

BOOL canPerformAction(id withSender) {
    return false;
} 

- (void)viewDidLoad {
   [super viewDidLoad];

   Class class = NSClassFromString(@"UIThreadSafeNode");
   class_addMethod(class, @selector(canPerformAction:withSender:), (IMP)canPerformAction, "@@:");
}

您可能应该将方法插入放在仅加载一次的地方,例如在AppDelegate中。

如果需要,这是完整的示例项目:https : //github.com/elliotfiske/UIWebView-TextEntry-CrashFix/tree/master

繁殖方法:

在UIWebView中创建文本输入表单,键入一些单词,然后将光标移动到句子中间单词的确切END。

然后,选择任何预想性文本建议。在这里查看实际的错误:崩溃再现的屏幕记录


2
我正在使用WKWebView。我喜欢您的骇客解决方案。我希望它能起作用!:)
阿卜杜拉·乌默(Ubd Ub),

我不能瑞普上UIWebView的崩溃上iOS13.2.2开发者测试版
harshith7823
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.