J'ai une application iOS qui semble planter aléatoirement sur un écran qui a un UIWebView. On dirait que le crash se produit principalement sur les appareils iPhone 5C (74% du temps) et 100% du temps sur iOS 10.X.iOS UIWebView se bloque aléatoirement sur WebCore :: FrameTree :: top
Le message d'exception est:
EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000028
A partir de cette adresse basse de la mémoire, il me fait penser à quelque chose était nil
.
Voici le backtrace (ce n'est pas le thread principal):
0 WebCore WebCore::FrameTree::top() + 0
1 WebCore WebCore::ContentSecurityPolicy::allowFrameAncestors() + 33
2 WebCore WebCore::DocumentLoader::responseReceived() + 413
3 WebCore WebCore::DocumentLoader::handleSubstituteDataLoadNow() + 203
4 WebCore WebCore::ThreadTimers::sharedTimerFiredInternal() + 149
5 WebCore WebCore::timerFired() + 23
6 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 15
7 CoreFoundation __CFRunLoopDoTimer + 833
8 CoreFoundation __CFRunLoopDoTimers + 189
9 CoreFoundation __CFRunLoopRun + 781
10 CoreFoundation CFRunLoopRunSpecific + 471
11 CoreFoundation CFRunLoopRunInMode + 105
12 WebCore RunWebThread() + 427
13 libsystem_pthread.dylib _pthread_body + 217
14 libsystem_pthread.dylib _pthread_start + 235
Je ne peux pas reproduire moi-même accident.
Depuis WebKit est open source, j'ai trouvé le code où il se bloque: WebCore::FrameTree::top. En regardant ce code, je devine que m_thisFrame->tree()
est NULL
, mais je ne suis pas sûr de savoir comment l'expliquer. Je ne suis pas sûr exactement ce que "cadres" et "arbres" sont dans ce contexte. A partir du backtrace, il semble qu'il y ait une minuterie qui est déclenchée, peut-être après que le View Controller ou le Web View ait été désalloué? Cette minuterie est-elle due à un appel JavaScript setTimeout
?
Aussi, je remarque chaque fois que ce crash se produit, j'obtiens un appel à [UIWebViewDelegate webView:didFailLoadWithError:]
juste avant le crash. Les erreurs les plus courantes renvoyées dans cette méthode de délégué sont:
- charge Frame interrompue
- trop HTTP redirige
- La demande a expiré
Mais je n'ai pas d'analyse en place pour corréler le message d'erreur avec le crash, donc je ne suis pas sûr lequel (le cas échéant) pourrait l'expliquer. Lorsque cette méthode de délégué se déclenche, je montre à l'utilisateur un message d'erreur dans un modal. Cela pourrait-il être lié à l'accident? J'ai essayé de reproduire les erreurs "Frame load interromped" et "too many HTTP redirections" mais ni l'une ni l'autre ne provoque le crash pour moi dans le simulateur.
Je l'ai déjà suivi les conseils de this answer (la plupart du temps) et appellent à [webview stopLoading]
viewWillDisappear
et je demande self.webView.delegate = nil
dans dealloc
du contenant View Controller, mais il n'a pas aidé.
Je suis confronté au même problème. Avez-vous trouvé une solution? – OMK
Je ne vais pas mettre cela comme une réponse parce que c'est de la spéculation, mais je pense que le passage à WKWebView peut résoudre ce genre de problèmes. –
Merci. Je vais essayer. – OMK