美文网首页
WKWebView请求添加Cookie

WKWebView请求添加Cookie

作者: 林夕copy | 来源:发表于2020-12-10 18:03 被阅读0次

WKWebView发送请求时不会把HTTPCookieStorage中的cookie写入请求中需要手动添加。

iOS11之前实现思路是在原有的URLRequest中注入cookie再load,这种做法只能在webView第一次请求的时候会生效,后续未跨域请求带上cookie需要在WKWebViewConfiguration 中添加WKUserScript.

iOS11后通过WKWebsiteDataStore管理

func injectCookie(request: URLRequest) -> URLRequest {
        if #available(iOS 11.0, *) {
            return request
        }
        
        guard let url = request.url else {
            return request
        }

        var newRequest = URLRequest(url: url)
        let cookies = HTTPCookieStorage.shared.cookies ?? []
        var cookiesHeaders: [String] = []
        for cookie in cookies {
            if isNeedInjectCookie(url) {
                cookiesHeaders.append("\(cookie.name)=\(cookie.value)")
            }
        }
        let header = cookiesHeaders.joined(separator: ";")
        newRequest.addValue(header, forHTTPHeaderField: "Cookie")
        return newRequest
    }

//
private func injectCookie(configuration: WKWebViewConfiguration) {
        guard let url = self.request.url else { return }
        let cookies = HTTPCookieStorage.shared.cookies ?? []
        if #available(iOS 11.0, *) {
            let dataStore = WKWebsiteDataStore.nonPersistent()
            for cookie in cookies {
                dataStore.httpCookieStore.setCookie(cookie, completionHandler: nil)
            }
            configuration.websiteDataStore = dataStore
        } else {
            var cookieList: [String] = []
            for cookie in cookies {
                // 不写“path=/” cookie设置不生效
                cookieList.append("\(cookie.name)=\(cookie.value);path=/")
            }
            let cookieString = cookieList.joined(separator: ";")
            let cookieSource = "document.cookie = '\(cookieString)';"
            let cookieScript = WKUserScript(source: cookieSource, injectionTime: .atDocumentStart, forMainFrameOnly: false)
            configuration.userContentController.addUserScript(cookieScript)
        }
    }

通过上述方案修改后的cookie,服务器无法再往请求中添加cookie,所以服务器返回的cookie需要本地记录,后续请求再继续添加.

实现WKNavigationDelegate

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
        if #available(iOS 11.0, *)  {
            let cookieStore = webView.configuration.websiteDataStore.httpCookieStore
            cookieStore.getAllCookies { (cookies) in
                for cookie in cookies {
                    HTTPCookieStorage.shared.setCookie(cookie)
                }
            }
        } else {
            let httpResponse = navigationResponse.response as? HTTPURLResponse
            let headerFields = httpResponse?.allHeaderFields as? [String : String]
            if let headerFields = headerFields, let url = httpResponse?.url {
                let cookies = HTTPCookie.cookies(withResponseHeaderFields: headerFields, for: url)
                for cookie in cookies {
                    HTTPCookieStorage.shared.setCookie(cookie)
                }
            }
        }
        decisionHandler(.allow)
    }

相关文章

  • iOS WKWebView添加Cookie

    网络请求添加Cookie都需要在request的时候添加 给request增加请求头 WKWebView加载请求

  • ios WKWebView Cookie

    WKWebView Cookie 加载cookie有两种方式1、使用js注入的形式添加2、使用请求头的形式添加 一...

  • WKWebView请求添加Cookie

    WKWebView发送请求时不会把HTTPCookieStorage中的cookie写入请求中需要手动添加。 iO...

  • WKWebview ajax添加cookie

    wkwebview 用WKUserScript添加cookie,cookie的source里必须带上 path

  • WKWebView 动态同步Cookie

    初始化WKWebView注入Cookie 这里拼接是Cookie 接口请求拿到登录Cookie保存在本地 动态同步...

  • WKWebview添加请求头

    给WKWebview添加请求头 当你看到这个标题的时候,说明你有要给WKWebView每次页面内请求发起时添加请求...

  • moco带cookie和headers请求

    moco可以接收带模拟cookie的请求,也可以模拟返回携带cookie的请求添加cookie和headers请求...

  • webview cookie 和请求头、响应头

    cookie的获取 cookie的设置: cookie的添加 请求头的添加 注:服务端收到的请求头的key会将你设...

  • WKWebView同步cookie操作

    需求说明 在WKWebView中同步cookie 在ajax请求中,增加cookie参数 在网络访问中,响应set...

  • WKWebView之cookie请求

    贴上代码: 另外附上其他需要cookie请求的代码: AFNetworking: WKWebView: 如果WKW...

网友评论

      本文标题:WKWebView请求添加Cookie

      本文链接:https://www.haomeiwen.com/subject/qwergktx.html