iOS UIWebView在WebCore :: FrameTree :: top上随机崩溃

Lir*_*dav 6 webkit uiwebview ios

我有一个iOS应用程序随机似乎在具有UIWebView的屏幕上崩溃.看起来崩溃主要发生在iPhone 5C设备上(占74%的时间),100%发生在iOS 10.X上.

异常消息是:

EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000028
Run Code Online (Sandbox Code Playgroud)

从那个低内存地址,它让我觉得有些东西nil.

这是回溯(这不是主线程):

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
Run Code Online (Sandbox Code Playgroud)

我自己无法重现这次崩溃.

由于WebKit是开源的,我找到了它崩溃的代码:WebCore :: FrameTree :: top.从查看代码,我猜m_thisFrame->tree()NULL,但我不知道如何解释它.我不确定在这种情况下究竟是什么"框架"和"树".

从回溯看起来有一些计时器被解雇,可能是在视图控制器或Web视图已被解除分配后?这个计时器是由于JavaScript setTimeout调用吗?

此外,我注意到每次发生此次崩溃时,我都会[UIWebViewDelegate webView:didFailLoadWithError:]在崩溃前接到电话.该委托方法中返回的最常见错误是:

  • 帧负载中断
  • HTTP重定向太多了
  • 请求超时

但是我没有将错误消息与崩溃相关联的分析,所以我不确定哪个(如果有的话)会解释它.当该委托方法触发时,我向用户显示模态中的错误消息.这可能与坠机有关吗?我尝试重现"帧加载中断"和"太多HTTP重定向"错误,但都没有导致我在模拟器中崩溃.

我已经按照建议在这个答案(大部分),并呼吁[webview stopLoading]viewWillDisappear和我呼吁self.webView.delegate = nildealloc含有视图控制器,但它并没有帮助.

Chr*_*ger 1

这并不是真正的答案,但此崩溃似乎与启用内容过滤(父控件)时有关。如果您将应用程序在 UIWebView 中加载的任何域添加到 iOS 父控件阻止列表中,您应该在应用程序日志中看到此错误(来自 WebKit 的 WebFilter 内部)。它似乎以某种方式使 UIWebView 无效,因此当您再次与它交互时,它会导致整个应用程序崩溃。您可以通过切换到 WKWebView 来避免崩溃。

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