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

标签 ios uiwebview webkit

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

异常信息是:

EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000028

从那个低内存地址来看,它让我觉得有些东西是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

我无法自己重现此崩溃。

由于 WebKit 是开源的,我找到了它崩溃的代码:WebCore::FrameTree::top .通过查看该代码,我猜测 m_thisFrame->tree()NULL,但我不确定如何解释它。我不确定在那种情况下到底什么是“框架”和“树”。

从回溯来看,似乎有一些计时器正在被触发,可能是在 View Controller 或 Web View 已经被释放之后?该计时器是由于 JavaScript setTimeout 调用引起的吗?

我还注意到每次发生这种崩溃时,我都会接到一个电话 [UIWebViewDelegate webView:didFailLoadWithError:]就在崩溃之前。该委托(delegate)方法中返回的最常见错误是:

  • 帧加载中断
  • 过多的 HTTP 重定向
  • 请求超时

但我没有适当的分析来将错误消息与崩溃联系起来,所以我不确定哪个(如果有的话)可以解释它。当该委托(delegate)方法触发时,我会在模式中向用户显示一条错误消息。这可能与坠机有关吗?我尝试重现“Frame load interrupted”和“too many HTTP redirects”错误,但都没有导致我在模拟器中崩溃。

我已经遵循了 this answer 中的建议(大部分)并在 viewWillDisappear 中调用 [webview stopLoading] 我在 dealloc 中调用 self.webView.delegate = nil > 包含 View Controller ,但它没有帮助。

最佳答案

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

WF: WebFilterEvaluator:addData: https://some-blocked-url.com 被限制:列入黑名单

关于iOS UIWebView 在 WebCore::FrameTree::top 上随机崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44057041/

相关文章:

html - 不支持背景渐变可以使用background-color吗?

带有表单元素的 CSS float div 在 mac 上的 Safari 3 中消失

ios - 模块 'Builtin' 没有名为 convertUnownedUnsafeToGuaranteed 的成员

iphone - iOS:从 super View 中删除一个 View 会导致另一个 View 被删除?

ios - 在 Xcode 的 Framework 中使用 Objective c 和 Swift

ios - UIWebView 在底部被 UITabBarController 截断

html - Swift 打开带参数的本地 HTML 文件

ios - 迅速3检查计时器是否正在运行

ios - 如何为 epub 阅读器 webview 设置背景图像(纹理)?

javascript - HTML5 LocalStorage 似乎已损坏