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

6

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

异常信息为:

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,但我不确定如何解释。我也不确定在这种情况下“frames”和“trees”具体是什么。

从回溯信息来看,似乎有些定时器被触发了,可能是在视图控制器或 Web 视图被销毁之后?这个定时器是否由 JavaScript 的 setTimeout 调用产生的?

此外,我注意到每次出现这种崩溃时,都会在崩溃之前调用 [UIWebViewDelegate webView:didFailLoadWithError:]。在该委托方法中返回的最常见错误是:

  • 框架加载被中断
  • HTTP 重定向太多
  • 请求超时

但我没有安装分析工具来将错误消息与崩溃相关联,因此不确定哪个(如果有的话)会解释这个问题。当该委托方法被触发时,我在模态框中向用户显示错误消息。这是否与崩溃有关?我尝试重现“框架加载被中断”和“HTTP 重定向太多”错误,但在模拟器中都没有引起崩溃。

我已经遵循了这个答案中的建议(大部分),在viewWillDisappear中调用[webview stopLoading],并在包含视图控制器的dealloc中调用self.webView.delegate = nil,但没有帮助。


我也遇到了同样的问题。你找到任何解决方案了吗? - OnkarK
我不会把这个作为答案,因为这只是猜测,但我认为切换到WKWebView可能会解决这些崩溃问题。 - Liron Yahdav
谢谢。我会尝试的。 - OnkarK
在家长控制设置和MDM黑名单的影响下,我遇到了同样的崩溃问题。但是在切换到WKWebView后,这种情况不再发生。 - SBK
1个回答

1
这不是一个答案,但是这个崩溃似乎与启用内容过滤(家长控制)有关。如果您将UIWebView加载的任何域添加到iOS家长控制阻止列表中,则应在应用程序日志中看到此错误(从WebKit的WebFilter内部发出)。它似乎以某种方式使UIWebView失效,因此当您再次与其交互时,会导致整个应用程序崩溃。您可以通过切换到WKWebView来避免崩溃。 WF: WebFilterEvaluator:addData: https://some-blocked-url.com is restricted: blacklisted

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接