bugfix> swift > 投稿

私は WKWebView を使用しています私のアプリで。私は webview にURLリクエストを送信しています 。ただし、このURLは認証(Cookie)を必要とします。クッキーを webview に渡しているすべてのリクエストに対して機能しますが、一部のケースでは正常に機能し、一部のケースでは機能しません。ここで何が問題なのですか?
私は次のことをしました:

func loadDataOnWebViewWithCookies(_ urlString: String)  {
    let url = URL(string: urlString)
    let request = URLRequest(url: url!)
    if request.url != nil {
     var cookies: [String : String]? = nil
     if let anURL = request.url, let anURL1 = HTTPCookieStorage.shared.cookies(for: anURL) {
            cookies = HTTPCookie.requestHeaderFields(with: anURL1)
        }
     if cookies?["Cookie"] != nil {
            request.addValue(cookies!["Cookie"]!, forHTTPHeaderField: "Cookie")
        }
     }
    self.webView.load(request)
}

私は以下のデリゲートを使用しています:

   func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if webView.url?.absoluteString != "my_home_url" && webView.url?.host == Constants.kHost {
            let headerFields = navigationAction.request.allHTTPHeaderFields
            let headerIsPresent = headerFields?.keys.contains("Cookie")
            if headerIsPresent! {
                decisionHandler(.allow)
            } else {
                let request = NSMutableURLRequest(url: navigationAction.request.url!)
                var cookies: [String : String]? = nil
                if let anURL = navigationAction.request.url, let anURL1 = HTTPCookieStorage.shared.cookies(for: anURL) {
                    cookies = HTTPCookie.requestHeaderFields(with: anURL1)
                }
                request.allHTTPHeaderFields = cookies
                webView.load(request as URLRequest)
                decisionHandler(.cancel)
            }
        } else if webView.url?.host != Constants.kHost {
            let tuple = getTokenAndId()
            if navigationAction.request.value(forHTTPHeaderField: Constants.headersData.token) == tuple.xToken {
                decisionHandler(.allow)
            } else {
                let request = prepareRequestForHomeService(request: navigationAction.request)
                decisionHandler(.cancel)
                self.webView.load(request as URLRequest)
            }
        } else {
            decisionHandler(.allow)
        }
}

ここで私が間違っている場合、そのために私を助けてください。 前もって感謝します :)

回答 1 件
  • @Pallavi:WKWebViewでCookieを渡すには、以下のライブラリを使用してください。

    https://github.com/Kofktu/WKCookieWebView

    ウェブビューを作成するには、以下のコードをご覧ください。

    func configureWebView() {
        if webView == nil {
            let height = (self.navigationController?.isNavigationBarHidden)! ? self.view.frame.size.height - 20 : self.view.frame.size.height - 64
            webView = WKCookieWebView(frame: CGRect(x: xOrigin, y: yOrigin, width: self.view.frame.size.width, height: height), configurationBlock: { (configuration) in
                let processPool = WKProcessPool()
                configuration.processPool = processPool
            })
            webView.scrollView.delegate = self
            webView.wkNavigationDelegate = self
            webView.onDecidePolicyForNavigationAction = { (webView, navigationAction, decisionHandler)  in
                 /// your code here                
            }
            webView.onDidReceiveChallenge = { (webView, navigationAction, completionHandler)  in
                /// your code here
            }
            webView.onDecidePolicyForNavigationResponse = { (webView, navigationResponse, decisionHandler)  in
               /// your code here
    }
    
    

あなたの答え