如何确定WKWebView崩溃的原因?

16

我正在一个为iOS 8+构建的Swift应用中使用WKWebView。在我的应用中,我在各种视图中使用WKWebView,例如在我的选项卡视图控制器中的每个选项卡中,界面都是基于WKWebView的。我和我的测试人员注意到,这些视图有时会完全变成空白,并且经过研究发现,似乎WKWebView会崩溃,空白视图就是结果。由于WKWebView的运作方式,幸运的是它不会使应用程序崩溃,但我也不确定如何捕获/记录有关导致它崩溃的信息(如果实际上是这样的话)。

我该如何确定WKWebView是否已崩溃以及原因是什么?

我目前处理此问题的方法是使用KVO(实际上是Facebook的KVOController)来监视WKWebView的“URL”属性,如果它从非nil变为nil,我就假定发生了崩溃,并重新加载Webview:

kvoController?.observe(webView, keyPath: "URL", options: NSKeyValueObservingOptions.New|NSKeyValueObservingOptions.Old) { (areaViewController, webView, change) -> Void in
    if change[NSKeyValueChangeNewKey] is NSNull && !(change[NSKeyValueChangeOldKey] is NSNull) {
        areaViewController.setup() // reload our webview
    }
}

但显然,找出崩溃的根本原因是很好的。


1
我看到Cordova中的WKWebView崩溃,也不知道如何解决导致的白屏问题。 - jimmont
我也在Cordova中遇到了WKWebView崩溃的问题。我使用的插件只是重新加载浏览器。然而,这会丢失我在Web应用程序中存储的所有状态信息。有没有人在确定导致崩溃的实际原因(错误代码等)方面取得了进展? - Shoerob
2个回答

10

这是一个非常讨厌的WKWebView问题,在Firefox for iOS中我们也遇到了类似的情况。

请查看以下错误报告:https://bugs.webkit.org/show_bug.cgi?id=148685

我没有很好的解决方案,但我有两个提示:

首先,当我们通过KVO发现webView.URL变成nil时,我们也进行了重新加载。然而,它会在许多事件上变成nil,例如重定向发生时,可能还会在提交表单时变成nil。因此这并不理想。

其次,在iOS9中,有一个新的API可以检测WebKit内容进程何时死亡。我们还没有尝试过,但我认为这将是一个更好的触发器来重新加载webView。

我认为目前还没有文档,但您可以在头文件中查看此信息:

- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView NS_AVAILABLE(10_11, 9_0);

Stefan,我目前遇到了相同的问题,但是上面的委托方法根本没有被调用。事实上,当webview或wkwebview完全挂起时,没有任何错误方法被调用。 我们有什么其他建议来解决这个问题吗?我正在渲染的webview工作得很好,但是当它在WKWebView上渲染时会卡住。 - lifemoveson
这个问题有进展了吗?我的WKWebView应用程序经常崩溃,通常是在输入文本到文本区域或点击按钮时发生。 - Fizzix
同样的问题。这个委托没有被调用过。 - arqam

0
  • (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView NS_AVAILABLE(10_11, 9_0); 这个代理方法只在iOS9及以上版本中被调用。但是如果你重新加载webview,那么之前保存的所有状态信息都将丢失。 可以在调用 [webview reload] 前尝试保存相关信息。

例如:

NSString *jsString = @"var arry=[];
for(var i=0; i<sessionStorage.length; i++){
    var  a={};a[sessionStorage.key(i)]=sessionStorage.getItem(sessionStorage.key(i));arry.push(a)};arry";

    [webView evaluateJavaScript:jsString completionHandler:^(id _Nullable obj, NSError * _Nullable error) {
    NSLog(@"jsString1===error=%@",error);
    NSLog(@"jsString1==obj==®%@",obj);
    if (obj == NULL ||obj ==[NSNull class]||obj==nil) {
        //重启webview
        [webView reload];
        return ;
    }
    //保存sessionStorage
    NSArray *arr = (NSArray*)obj;

    //保存后重启webview
    [webView reload];
}];

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