如何确定WKWebView崩溃的原因

时间:2015-08-13 17:34:46

标签: ios wkwebview

我在为iOS 8+构建的Swift应用程序中使用WKWebView。我在我的应用程序的各种视图中使用WKWebView的实例,例如在我的选项卡视图控制器的每个选项卡中,该界面基于WKWebView。

我和我的测试人员已经注意到这些视图有时会完全空白,在研究了这个问题之后,似乎WKWebView可能会崩溃,而空白视图就是结果。幸运的是,由于WKWebView的运行方式,它并没有降低应用程序,但我也不清楚如何捕获/记录导致崩溃的原因的信息(如果这实际上是发生了什么)。

如何确定WKWebView是否/为何崩溃?

我目前解决的问题是我使用KVO(实际上是Facebook的KVOController)来监控" URL" WKWebView的属性,如果从非零到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
    }
}

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

2 个答案:

答案 0 :(得分:7)

这是我们在 Firefox for iOS 中遇到的非常讨厌的WKWebView问题。

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

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

首先,当我们通过KVO发现webView.URL转为nil时,我们也在进行重新加载。然而事实证明它在许多事件上变成了nil。例如,当重定向发生时,也可能在提交表单时。所以这不太理想。

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

我认为还没有文档,但你可以在头文件中看到这个:

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

答案 1 :(得分: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];
}];