- [UIThreadSafeNode canPerformAction: withSender:]: selettore non riconosciuto inviato all'istanza


9

Sto affrontando questo crash nella mia app 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>

Finora sono stati segnalati oltre 100 incidenti. Questo succede solo in iOS 12 e iOS 13.

Non sono in grado di scoprire come sta accadendo e come riprodurlo.

La traccia dello stack non mostra alcun codice della mia app.

Ho caricato il rapporto completo sugli arresti anomali qui .

Qualsiasi aiuto sarebbe molto apprezzato.

Risposte:


10

Questa sembra essere la regressione di un antico bug relativo alla "cancellazione in avanti" nella voce di testo iOS: http://www.openradar.me/15114422

Credo che sia regredito a causa della nuova tastiera "scorri per digitare".

Hai 2 opzioni per risolvere:

  1. Aggiorna UIWebView obsoleto a WKWebView
  2. Soluzione Hacky: inserire il selettore mancante UIThreadSafeNodein fase di esecuzione.

Ecco un esempio di codice su come inserire il selettore mancante:

BOOL canPerformAction(id withSender) {
    return false;
} 

- (void)viewDidLoad {
   [super viewDidLoad];

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

Probabilmente dovresti inserire l'inserimento del metodo in un punto che viene caricato solo una volta, come in AppDelegate.

Ecco il progetto di esempio completo se ne hai bisogno: https://github.com/elliotfiske/UIWebView-TextEntry-CrashFix/tree/master

Come riprodurre:

Crea un modulo di immissione testo in UIWebView, digita alcune parole, quindi sposta il cursore sulla FINE esatta di una parola nel mezzo della frase.

Quindi, scegli uno qualsiasi dei suggerimenti di testo predittivo. Vedi il bug in azione qui:Registrazione dello schermo della riproduzione dello schianto


2
Sto usando WKWebView. Mi piace la tua soluzione di hacking. Spero che funzioni! :)
Abdullah Umer,

Non riesco a riproporre il crash su UIWebView su beta sviluppatore
iOS13.2.2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.