概述
项目中用到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];
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];
};
}
}
最后
以上就是坦率苗条为你收集整理的WKWebview的那些坑之白屏问题的全部内容,希望文章能够帮你解决WKWebview的那些坑之白屏问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复