WKWebViewでのdidReceiveChallengeエラーの解決方法


  1. TLS証明書の問題:

    • サーバーが自己署名証明書を使用している場合や、証明書の有効期限が切れている場合にエラーが発生することがあります。
    • 解決方法: URLAuthenticationChallengeを処理し、信頼できる証明書を指定する必要があります。以下はSwiftでの例です。
    func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
       if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
           let credential = URLCredential(trust: challenge.protectionSpace.serverTrust!)
           completionHandler(.useCredential, credential)
       }
    }
  2. 認証情報の問題:

    • ウェブページがベーシック認証を要求している場合、認証情報が不足しているとエラーが発生することがあります。
    • 解決方法: URLCredentialを使用して認証情報を提供します。以下はSwiftでの例です。
    let username = "your_username"
    let password = "your_password"
    let credential = URLCredential(user: username, password: password, persistence: .forSession)
    webView.load(URLRequest(url: yourURL, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 10))
    webView.configuration.urlCredentialStorage?.set(credential, for: yourProtectionSpace)
  3. リダイレクトの問題:

    • サーバーがリダイレクトを返す場合、リダイレクト先のURLが信頼されない場合にエラーが発生することがあります。
    • 解決方法: WKNavigationDelegatedecidePolicyForメソッドを使用してリダイレクトを許可します。以下はSwiftでの例です。
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
       if let url = navigationAction.request.url {
           if url.host == "redirected_domain.com" {
               decisionHandler(.allow)
               return
           }
       }
       decisionHandler(.cancel)
    }

これらの解決方法とコード例を使用することで、「didReceiveChallenge」エラーを処理し、WKWebViewを正常に使用することができます。