前言
隨著WKWebView的推出, 解決了很多UIWebView 的問題。比如加載速度慢,內存泄露等問題。WKWebView是在iOS 8 推出,前段時間正好把項目也適配到iOS 8 以上了,終于可以把項目中的UIWebView 替換成WKWebView。
WKWebView的特點:
但是發現在使用的時候還是有很多坑,這其中就有屢見不鮮的白屏問題。經過一些調試、google 發現不外乎這3個原因。下面話不多說了,來一起看看詳細的介紹吧。
1. iOS 8.0 - iOS 8.2 偶爾白屏問題
這個是WKWebView 剛推出時的Bug,偶爾會出現白屏,如果想避免這種問題,只能通過版本號判斷,小于8.2的系統使用UIWebView。
2. HTTPS 請求,未實現證書認證代理導致頁面不加載的問題
如果是HTTPS 請求,需要在WKWebView 的 WKNavigationDelegate 中的一個代理方法 中實現獲取服務器認證的邏輯,最后返回給服務端。 這個問題常常出現在客戶端無法獲得安全認證的時候(沒有證書,或者是自建證書),比如說https://www.apple.com/cn 是默認的蘋果中國的地址,但是 https://www.apple.com.cn 也是可以訪問的(會自動跳轉到 https://www.apple.com/cn ) ,只是在Safari 的安全認證中通不過,我們需要在代理方法中通過服務端給的驗證方式創建一個憑證,然后繼續申請訪問。比如在Safari 瀏覽器中第一次訪問時就會彈出對話框,點擊繼續后就可以繼續訪問。
通過實現以下代理即可解決
func webView(webView: WKWebView, didReceiveAuthenticationChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) { // 判斷服務器采用的驗證方法 if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { if challenge.previousFailureCount == 0 { // 如果沒有錯誤的情況下 創建一個憑證,并使用證書 let credential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!) completionHandler(.UseCredential, credential) } else { // 驗證失敗,取消本次驗證 completionHandler(.CancelAuthenticationChallenge, nil) } } else { completionHandler(.CancelAuthenticationChallenge, nil) }}
3. 由于滾動組件嵌套的結構,不刷新的問題
這是有個哥們遇到的問題,分析的很仔細,從發現問題,到分析WebKit 源碼,最后得知是在頁面滾動后沒有正常的調用 WKWebView 的 _updateVisibleContentRects 方法刷新需要渲染的內容導致。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。
新聞熱點
疑難解答