我有一个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。通过查看该代码,我猜测NULL
是setTimeout
,但我不确定如何解释它。我不确定究竟是什么"帧"和"树"正是在这种背景下。
从回溯中看起来有一些计时器被解雇,可能是在View Controller或Web View已经解除分配之后?该计时器是由JavaScript [webview stopLoading]
调用吗?
此外,我注意到每次崩溃发生时,我都会在崩溃前接到[UIWebViewDelegate webView:didFailLoadWithError:]
的电话。该委托方法中返回的最常见错误是:
但我没有适当的分析来将错误消息与崩溃相关联,因此我不确定哪个(如果有的话)会解释它。当该委托方法触发时,我向用户显示模态中的错误消息。这可能与坠机有关吗?我尝试重现'#34;帧加载中断"和#34;太多的HTTP重定向"错误但不会导致我在模拟器中崩溃。
我已经按照this answer中的建议(主要是)并在viewWillDisappear
中致电self.webView.delegate = nil
,然后在包含View Controller的dealloc
中调用{{1}}但是它没有帮助。
答案 0 :(得分:1)
这不是一个真正的答案,但这次崩溃似乎与启用内容过滤(父控件)有关。如果您将应用程序在UIWebView中加载的任何域添加到iOS父控件阻止列表中,您应该在应用程序日志中看到此错误(来自WebKit的WebFilter内部)。它似乎以某种方式使UIWebView无效,因此当您再次与它进行交互时,它会崩溃整个应用程序。您可以通过切换到WKWebView来避免崩溃。
WF: WebFilterEvaluator:addData: https://some-blocked-url.com is restricted: blacklisted