【Swift】WKWebView載入HTTPS的連結
阿新 • • 發佈:2018-12-16
OC: HTTPS已經越來越被重視,前面我也寫過一系列的HTTPS的相關文章HTTPS從原理到應用(四):iOS中HTTPS實際使用當載入一些HTTPS的頁面的時候,如果此網站使用的根證書已經內建到了手機中這些HTTPS的連結可以正常的通過驗證並正常載入。但是如果使用的證書(一般為自建證書)的根證書並沒有內建到手機中,這時是連結是無法正常載入的,必須要做一個許可權認證。開始在UIWebView的時候,是把請求儲存下來然後使用NSURLConnection去重新發起請求,然後走NSURLConnection的許可權認證通道,認證通過後,在使用UIWebView去載入這個請求。
在WKWebView中,WKNavigationDelegate中提供了一個許可權認證的代理方法,這是許可權認證更為便捷。代理方法如下:
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { if ([challenge previousFailureCount] == 0) { NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; completionHandler(NSURLSessionAuthChallengeUseCredential, credential); } else { completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); } } else { completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); } } // Swift: func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { if challenge.previousFailureCount == 0 { let credential = URLCredential(trust: challenge.protectionSpace.serverTrust!) completionHandler(URLSession.AuthChallengeDisposition.useCredential,credential) }else{ completionHandler(URLSession.AuthChallengeDisposition.cancelAuthenticationChallenge,nil) } }else{ completionHandler(URLSession.AuthChallengeDisposition.cancelAuthenticationChallenge,nil) } }
這個方法比原來UIWebView的認證簡單的多。但是使用中卻發現了一個很蛋疼的問題,iOS8系統下,自建證書的HTTPS連結,不呼叫此代理方法。查來查去,原來是一個bug,在iOS9中已經修復,這明顯就是不管iOS8的情況了,而且此方法也沒有標記在iOS9中使用,這點讓我感到有點失望。這樣我就又想到了換回原來UIWebView的許可權認證方式,但是試來試去,發現也不能使用了。所以關於自建證書的HTTPS連結在iOS8下面使用WKWebView載入,我沒有找到很好的辦法去解決此問題。這樣我不得已有些連結換回了HTTP,或者在iOS8下面在換回UIWebView。如果你有解決辦法,也歡迎私信我,感激不盡。