WKWebView哪些事

http://www.tuicool.com/articles/QbE3Mb7

简述:WKWebView是苹果在WWDC 2014上推出的新一代webView组件,用以替代UIKit中笨重难用,内存泄漏的UIWebView。WKWebView拥有60fps滚动率、和safari相同的JavaScript引擎等优势。

1:加载不受信任的Https服务器的时候,出现不安全的访问,WKWebView加载网页就会出现白屏

解决方式:设置webView.navigationDelegate = self代理

实现此代理方法:

func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {

if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {

let card = URLCredential.init(trust: challenge.protectionSpace.serverTrust!)

completionHandler(URLSession.AuthChallengeDisposition.useCredential, card)

}

}

2: WKWebView自诩拥有更快的加载速度,更低的内存占用,但实际上WKWebView是一个多进程组件,Network Loading以及UI Rendering在其它进程中执行。初次适配WKWebView的时候,我们也惊讶于打开WKWebView后,App进程内存的消耗反而大幅下降,但是仔细观察会发现,Other Process的内存占用会增加。在一些用webGL渲染的复杂面,使用WKWebView总体的内存占用(App Process Memory + Other Process Memory)不见得比UIWebView少很多。

在UIWebView上当内存占用太大的时候,App Process会crash; 而在WKWebView上当总体的内存占用比较大的时候,WebContent  Process会crash,从而出现白屏的现象。在WKWebView中加载下面的测试链接可以稳定重现白屏现象:

http://people.mozilla.org/~rnewman/fennec/mem.html

这个时候WKWebView.URL会变为nil,简单的reload刷新操作已经失效,对于一些长驻的H5页面影响比较大。

解决方案是:

A、借助WKNavigationDelegate,iOS9以后WKNavigationDelegate新增了一个回调函数:

-(void)webViewWebContentProcessDidTerminate:(WKWebView*)webViewAPI_AVAILABLE(macosx(10.11), ios(9.0));

当WKWebView总体内存占用过大,页面即将白屏的时候,系统会调用上面的回调函数,我们在该函数里执行[webView reload]  (这个时候webView.URL取值尚不为nil)解决白屏问题。在一些高内存消耗的页面可能会频繁刷新当前页面,H5侧也要做相应的适配操作。

B、检测webView.title是否为空

并不是所有H5页面白屏的时候都会调用上面的回调函数,比如,最近遇到的高内存消耗的H5页面上present系统相机,拍照完毕后返回原来页面的时候出现白屏现象(拍照过程消耗了大量内存,导致内存紧张,WebContent Process被系统挂起),但上面的回调函数并没有被调用。在WKWebView白屏的时候,另一种现象是webView.title会被置空,因此,可以在viewWillAppear的时候检测webView.title是否为空来reload页面。

综合以上两种方法可以解决大多数的白屏问题。

其它问题详解:请前往http://www.tuicool.com/articles/QbE3Mb7

推荐阅读更多精彩内容