1. 程式人生 > >【Swift】WKWebView載入HTTPS的連結

【Swift】WKWebView載入HTTPS的連結

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。如果你有解決辦法,也歡迎私信我,感激不盡。