目标:将第三方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
您知道解决此问题的任何解决方法吗?
答案 0 :(得分:0)
我想我找到了一个解决方案,但这有点“棘手”。
创建一个返回URL的方法:
DispatchSemaphore
以发送同步请求URLSession
中执行请求在将内容加载到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
}