WKWebview的那些坑之白屏问题

项目中用到WKWebview的童鞋有可能会遇到突然页面白屏问题,这个问题是因为内存不够了webview的进程被程序终止了,那我们如何监听到进程被终止的事件以及做何处理呢?


(一)监听WKWebview进程终止

iOS9时系统提供了一个监听方法

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

}


iOS8则需要自己添加一个监听事件,即监听URL,当之前的URL不为空,而新的URL为空时则表示进程被终止了,c此处建议添加一个iOS8的判断,并且delloc时需要移除观察者,也需加iOS8判断

   [self.wkwebView addObserver:self forKeyPath:@"URL" options:NSKeyValueObservingOptionNew context:nil];



(二)进程终止时处理

进程终止后需要我们重新加载 WKWebview,只需要调用reload方法即可重新加载出页面,


具体代码如下:

iOS9监听处理,此处的processDidTerminated变量,是为了标志进程终止这个状态,可用户重新加载页面时保存数据,以免数据丢失。

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

 

    NSLog(@"进程被终止");

    NSLog(@"%@",webView.URL);

    processDidTerminated = YES;

    [webView reload];


}


iOS8监听处理

#pragma mark - KVO

// 计算wkWebView进度条

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    if (object == self.wkwebView && [keyPath isEqualToString:@"estimatedProgress"]) {

        CGFloat newprogress = [[change objectForKey:NSKeyValueChangeNewKey] doubleValue];

        if (newprogress == 1) {

            [self.progressView setProgress:1.0 animated:YES];

            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

                self.progressView.hidden = YES;

                [self.progressView setProgress:0 animated:NO];

            });

            

        }else {

            self.progressView.hidden = NO;

            [self.progressView setProgress:newprogress animated:YES];

        }

    }else if (object == self.wkwebView && [keyPath isEqualToString:@"URL"])

    {

        NSURL *newUrl = [change objectForKey:NSKeyValueChangeNewKey];

        NSURL *oldUrl = [change objectForKey:NSKeyValueChangeOldKey];

        if (IsNull(newUrl) && !IsNull(oldUrl)) {

            processDidTerminated = YES;

            [self.wkwebView reload];

        };

    }

}






你可能感兴趣的:(iOS开发,iOS基础,性能优化)