WKWebView 白屏问题

情况一:内存占用过大,会执行webViewWebContentProcessDidTerminate进程终止方法。此方法适用于ios9.0以上, 出现此情况, 尽量将网络请求以及消耗内存的操作交给H5来实现。

//进程终止(内存消耗过大导致白屏)
- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView {
    [webView reload];
}

情况二: 退到后台,再次唤醒出现白屏, 需要判断webView是否处于白屏状态。
方法1: 判断当前webView的title为空。 但是对于本来title就为空的页面不适用。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if (self.webView.title == nil || self.webView.title.length == 0) {
        [self.webView reload];
    }
}

方法2:判断当前webview的URL为空或about:blank。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if ([self.webView.URL.absoluteString isEqualToString:@""] || self.webView.URL.absoluteString.length == 0) {
        [self.webView reload];
    }
}

方法3:通过执行JS代码document.body.innerHTML查看页面内容。

//监听app进入前台通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appEnterPlayground) name:UIApplicationDidBecomeActiveNotification object:nil];

- (void)appEnterPlayground {
    [self.webView evaluateJavaScript:@"document.body.innerHTML"
                   completionHandler:^(id _Nullable result, NSError * _Nullable error) {
        NSString *innerHTML = result;
        if ([innerHTML isEqualToString:@""] || innerHTML.length == 0) {
            [self.webView reload];
        }
    }];
}

以上三种方法并非绝对有效,只是针对特定的网页

方法4:判断是否白屏方法

- (BOOL)isBlankView:(UIView*)view {
    Class wkCompositingView = NSClassFromString(@"WKCompositingView");
    if ([view isKindOfClass:[wkCompositingView class]]) {
        return NO;
    }
    for(UIView *subView in view.subviews) {
        if (![self isBlankView:subView]) {
            return NO;
        }
    }
    return YES;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容