关于WKWebview白屏问题的一丝解决方案
2023-03-02 本文已影响0人
程序猿界的cai渣渣
关于WKWebview加载html之后,代理方法返回加载成功,但却是白屏状态,找到几个方法,如下。
1. 清理缓存方法
NSMutableArray *types = [@[WKWebsiteDataTypeMemoryCache, WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeOfflineWebApplicationCache, WKWebsiteDataTypeCookies, WKWebsiteDataTypeSessionStorage, WKWebsiteDataTypeLocalStorage, WKWebsiteDataTypeWebSQLDatabases, WKWebsiteDataTypeIndexedDBDatabases] mutableCopy];
if (@available(iOS 11.3, *)) {
[types addObject:WKWebsiteDataTypeFetchCache];
[types addObject:WKWebsiteDataTypeServiceWorkerRegistrations];
}
// 9.0之后才有的
NSSet *websiteDataTypes = [NSSet setWithArray:types];
NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
}];
2. 白屏问题描述及方法
当前页面是白屏状态,但是在Safari-开发中,点击“刷新”就会出现正常的页面,由此判定是缓存问题,采用了网上的方法:API私有刷新方法:_updateVisibleContentRects。此方法还可以用以 webview滑动下半部分空白问题。
方法1:
if ([self.webView respondsToSelector:@selector(_updateVisibleContentRects)]) {
((void(*)(id,SEL,BOOL))objc_msgSend)(self.webView, @selector(_updateVisibleContentRects), NO);
}
方法2:
SEL sel = NSSelectorFromString(@"_updateVisibleContentRects");
if ([self.webView respondsToSelector:sel]) {
((void(*)(id,SEL,BOOL))objc_msgSend)(self.webView, sel, NO);
}
3. 清空URL的缓存操作
[[NSURLCache sharedURLCache] removeAllCachedResponses];
4. 检测WKWebview白屏或者返回内容为空方法
方法1:
[webView evaluateJavaScript:@"document.body.innerHTML" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
NSString *resultString = (NSString *)result;
DebugLog(@"加载内容 document.body.innerHTML: %@", resultString);
if (resultString.length == 0) {
// 可以做其他操作:刷新或者退出等
[webView reload];
}
}];
方法2:
// 避免h5页白屏,代理方法
- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView {
[_webView reload];
}