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

时间:2017-05-18 20:15:20

标签: ios uiwebview webkit

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

异常消息是:

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

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

m_thisFrame->tree()

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

由于WebKit是开源的,我找到了崩溃的代码:WebCore::FrameTree::top。通过查看该代码,我猜测NULLsetTimeout,但我不确定如何解释它。我不确定究竟是什么"帧"和"树"正是在这种背景下。

从回溯中看起来有一些计时器被解雇,可能是在View Controller或Web View已经解除分配之后?该计时器是由JavaScript [webview stopLoading]调用吗?

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

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

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

我已经按照this answer中的建议(主要是)并在viewWillDisappear中致电self.webView.delegate = nil,然后在包含View Controller的dealloc中调用{{1}}但是它没有帮助。

1 个答案:

答案 0 :(得分:1)

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

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