- [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

ฉันไม่สามารถค้นหาว่าสิ่งนี้เกิดขึ้นได้อย่างไรและจะทำซ้ำได้อย่างไร

การติดตามสแต็กไม่แสดงรหัสแอปใด ๆ ของฉัน

ฉันได้อัปโหลดรายงานข้อขัดข้องแบบเต็มที่นี่แล้ว

ความช่วยเหลือใด ๆ จะได้รับการชื่นชมอย่างมาก

คำตอบ:


10

นี่น่าจะเป็นการถดถอยของบั๊กโบราณที่เกี่ยวข้องกับ "forward delete" ในการป้อนข้อความ iOS: http://www.openradar.me/15114422

ฉันเชื่อว่ามันถดถอยเนื่องจากแป้นพิมพ์ "กวาดนิ้วเพื่อพิมพ์" ใหม่

คุณมี 2 ตัวเลือกในการแก้ไข:

  1. อัปเกรด UIWebView ที่เลิกใช้แล้วเป็น WKWebView
  2. โซลูชันแฮ็ค: ใส่ตัวเลือกที่ขาดหายไปเมื่อ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 พิมพ์คำบางคำแล้วเลื่อนเคอร์เซอร์ไปยังจุดสิ้นสุดที่แท้จริงของคำที่อยู่ตรงกลางของประโยค

จากนั้นเลือกคำแนะนำข้อความคาดการณ์ใด ๆ ดูข้อผิดพลาดในการดำเนินการที่นี่:การบันทึกหน้าจอของการทำซ้ำการชน


2
ฉันใช้ WKWebView ฉันชอบโซลูชันแฮ็คของคุณ ฉันหวังว่ามันจะใช้งานได้! :)
Abdullah Umer

ฉันไม่สามารถทำซ้ำความผิดพลาดใน UIWebView บนนักพัฒนาเบต้า
iOS13.2.2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.