WKWebview頁(yè)面突然白屏問(wèn)題
頁(yè)面突然白屏可能是由于加載資源過(guò)大礼殊,內(nèi)存不足
,導(dǎo)致webview的進(jìn)程被程序終止了茸时。
針對(duì)這個(gè)問(wèn)題贡定,在項(xiàng)目中,完成了以下修改:
1.清理WKWebView緩存
WKWebView清除緩存只能iOS9使用可都,低于iOS9運(yùn)行會(huì)崩潰缓待。所以蚓耽,為了適配iOS7和iOS8,需要做版本判斷
:
if ([[[UIDevice currentDevice]systemVersion]intValue ] >= 9.0) {
NSArray * types =@[WKWebsiteDataTypeMemoryCache,WKWebsiteDataTypeDiskCache]; // 9.0之后才有的
NSSet *websiteDataTypes = [NSSet setWithArray:types];
NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
}];
}else{
NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES) objectAtIndex:0];
NSString *cookiesFolderPath = [libraryPath stringByAppendingString:@"/Cookies"];
NSLog(@"%@", cookiesFolderPath);
NSError *errors;
[[NSFileManager defaultManager] removeItemAtPath:cookiesFolderPath error:&errors];
}
WKWebView是iOS8之后出現(xiàn)的旋炒,相較于UIWebView步悠,WKWebView占用的內(nèi)存更小,還有一些其他的優(yōu)化瘫镇。但是如果我們不去主動(dòng)清理webView產(chǎn)生的緩存鼎兽,兩者都會(huì)存在緩存這個(gè)問(wèn)題。比如說(shuō)一個(gè)網(wǎng)頁(yè)改了一些內(nèi)容铣除,如果不清理緩存谚咬,可能很長(zhǎng)一段時(shí)間我們都沒(méi)辦法看到新的內(nèi)容,唯一的辦法是卸載重裝尚粘。
在加載webView的ViewController
的viewDidLoad
中實(shí)現(xiàn)這些代碼择卦,可以保證每次加載的webView的內(nèi)容都是最新的。
2.借助 WKNavigtionDelegate
在 UIWebView 上當(dāng)內(nèi)存占用太大的時(shí)候郎嫁,App Process 會(huì) crash秉继;而在 WKWebView 上當(dāng)總體的內(nèi)存占用比較大的時(shí)候,WebContent Process 會(huì) crash泽铛,從而出現(xiàn)白屏
現(xiàn)象尚辑。
當(dāng) WKWebView 總體內(nèi)存占用過(guò)大,頁(yè)面即將白屏的時(shí)候盔腔,系統(tǒng)會(huì)調(diào)用上面的回調(diào)函數(shù)杠茬,我們?cè)谠摵瘮?shù)里執(zhí)行[webView reload](這個(gè)時(shí)候 webView.URL 取值尚不為 nil)解決白屏問(wèn)題。在一些高內(nèi)存消耗的頁(yè)面可能會(huì)頻繁刷新當(dāng)前頁(yè)面铲觉,H5則也要做相應(yīng)的適配操作澈蝙。
- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView API_AVAILABLE(macosx(10.11), ios(9.0));
但并不是所有白屏都會(huì)掉用上面方法,可以在 viewWillAppear 的時(shí)候檢測(cè) webView.title 是否為空來(lái) reload 頁(yè)面撵幽。
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (self.webView.title == nil) {
[self.webView reload];
}
}
參考文章:
https://blog.csdn.net/ljc_563812704/article/details/84071186
http://www.reibang.com/p/e2959be73128