白屏场景
加载到WKWebView页面后,前/后台来回切换APP。
白屏原因
WKWebView是一个多进程组件,Network Loading以及UI Rendering在其它进程中执行。所以UIWebView上当内存占用太大的时候,App Process会crash;而在WKWebView上当总体的内存占用比较大的时候,WebContent Process会crash,从而出现白屏现象。
问题分析
对于如何定位白屏和解决白屏的问题在网上找了好多文章,总结如下:
定位白屏:
1、“检测 webView.title 是否为空”
解决白屏:
1、尝试在每次请求kWebview前清理缓存;
2、[webview reload];
3、实现WKWebView中WKScrollview的- (void)scrollViewDidScroll:(UIScrollView *)scrollView 代理方法,然后在方法内添加代码:[webview setNeedsLayout]。
... ...
以上方案基本都不行!!!
最后,通过XCode视图调试分析WKWebView视图层次发现,白屏的WebView的中缺少一个WKCompositingView视图(WKWebView的渲染单元,属于渲染进程)。 对比如下图:
解决方案
可以遍历WKWebView的subviews,通过是否包含WKCompositingView来判断是否白屏。按照网络方案,清缓存、reload和setNeedsLayout都不能解决白屏,所以只能回收旧webview(webview = nil 后记得清除代理,移除监听,要不然会crash)创建新的 webview, 然后重新request。
// 判断是否白屏
- (BOOL)isBlankView:(UIView*)view { // YES:blank
ClasswkCompositingView =NSClassFromString(@"WKCompositingView");
if ([viewisKindOfClass:[wkCompositingView class]]) {
returnNO;
}
for(UIView*subViewinview.subviews) {
if (![selfisBlankView:subView]) {
returnNO;
}
}
returnYES;
}