在iOS 12中设置WKWebView cookie接受策略

时间:2018-12-13 16:42:39

标签: ios swift wkwebview

目标:将第三方Cookie注入WKWebView

在iOS 12之前,我可以通过以下代码片段解决此问题(请参见https://medium.com/@flexaddicted/how-to-set-wkwebview-cookie-accept-policy-d8a2d3b77420):

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
  guard let response = navigationResponse.response as? HTTPURLResponse,
    let url = navigationResponse.response.url else {
    decisionHandler(.cancel)
    return
  }

  if let headerFields = response.allHeaderFields as? [String: String] {
    let cookies = HTTPCookie.cookies(withResponseHeaderFields: headerFields, for: url)
    cookies.forEach { cookie in
      webView.configuration.websiteDataStore.httpCookieStore.setCookie(cookie)
    }
  }

  decisionHandler(.allow)
}

WKWebView的回复中没有从iOS 12开始的cookie。

https://bugs.webkit.org/show_bug.cgi?id=188691

您知道解决此问题的任何解决方法吗?

1 个答案:

答案 0 :(得分:0)

我想我找到了一个解决方案,但这有点“棘手”。

创建一个返回URL的方法:

  1. 创建一个DispatchSemaphore以发送同步请求
  2. URLSession中执行请求
  3. 在DataTask的末尾,检索响应?.url

在将内容加载到WKWebView中之前,先从WKWebView的{​​{1}}中设置cookie。

它就像一种魅力。

URLSession
func getAuthenticatedURL(from url: URL) -> URL? {
    let session = URLSession.shared
    let semaphore = DispatchSemaphore(value:0)

    var result: URL? = nil

    session.dataTask(with: url) { _, response, _ in
        result = response?.url
        semaphore.signal()
    }.resume()

    semaphore.wait()

    return result
}