2017-05-18 1 views
5

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é.

+0

Je suis confronté au même problème. Avez-vous trouvé une solution? – OMK

+0

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. –

+0

Merci. Je vais essayer. – OMK

Répondre

0

Ce n'est pas vraiment une réponse, mais ce problème semble être lié au moment où le filtrage du contenu (contrôles parents) est activé. Si vous ajoutez le domaine que votre application charge dans UIWebView à la liste de contrôle des contrôles parent iOS, vous devriez voir cette erreur dans les journaux d'application (venant en interne du WebFilter de WebKit). Il semble invalider UIWebView d'une manière ou d'une autre, donc lorsque vous interagissez à nouveau avec lui, il bloque toute votre application. Vous pouvez probablement éviter le crash en passant à WKWebView.

WF: WebFilterEvaluator:addData: https://some-blocked-url.com is restricted: blacklisted