swift - WKNavigationResponse 不再通过其 response.header 提供对 cookie 的访问
问题描述
自推出以来,我一直在使用 WKWebView 而不是 UIWebView。我一直在使用委托方法 webView(decidePolicyFor navigationResponse) 函数来访问 navigationResponse 对象及其响应属性的 allHeaderFields 属性,以便从任何给定请求中读取 cookie。
public func webView(webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
guard let response = navigationResponse.response as? HTTPURLResponse,
let url = response.url,
response.statusCode == 200,
let headers = response.allHeaderFields as? [String: String] else {
decisionHandler(.cancel)
return
}
let cookies: NSArray = HTTPCookie.cookies(withResponseHeaderFields: headers, for: url) as NSArray
for cookie in cookies {
let aCookie = cookie as! HTTPCookie
print("Background oAuth wkwebview response cookie: \(aCookie.name)")
HTTPCookieStorage.shared.setCookie(aCookie)
}
decisionHandler(.allow)
}
直到上周,在 iOS 9-12(inc. beta 1-12&GM)中,如果响应的标头中有 cookie,则始终填充上述代码中的“cookie”。截至本周,随着 iOS 12 的发布,iOS 12 上的 cookie 始终为空。我在许多设备上对此进行了测试,但对于运行任何版本的 iOS 12 的任何设备,cookie 都无法访问。所有先前的设备固件版本仍按预期工作。
我有一台设备自发布以来一直使用 12 Beta 1 固件。直到本周,此代码在此设备上仍然有效。为什么在没有固件更新的情况下,iOS 12 上的 cookie 会突然停止访问?
解决方案
我能够通过利用新的 WKWebViewConfiguration 的 WebSiteDataStore 在 iOS 11+ 上获取 cookie 来解决这个问题
public func webView(webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
guard let response = navigationResponse.response as? HTTPURLResponse,
let url = response.url,
response.statusCode == 200,
let headers = response.allHeaderFields as? [String: String] else {
decisionHandler(.cancel)
return
}
let cookies: NSArray = HTTPCookie.cookies(withResponseHeaderFields: headers, for: url) as NSArray
if #available(iOS 11.0, *) {
webView.configuration.websiteDataStore.httpCookieStore.getAllCookies { cookies in
for aCookie in cookies {
print("Background oAuth wkwebview response cookie: \(aCookie.name)")
HTTPCookieStorage.shared.setCookie(aCookie)
}
decisionHandler(.allow)
}
} else {
// Fallback on earlier versions
}
}
推荐阅读
- neural-network - 如何在神经网络中强调选定的输出
- python - Pyinstaller 不打包 python 编码文件
- python - Python ValueError:具有多个元素的数组的真值不明确。似乎没有答案适用于我的错误
- javascript - AddEventListener 多次影响性能
- python - 是否可以在 django 模板内的主 for 循环内创建一个 for 循环?
- homebrew - 如何修复无法更新或升级 Homebrew
- python - 试图在 pygame 中旋转图像以进行移动
- python - seaborn.jointplot() 中的参数
- python - 从元组列表中过滤掉整数
- javascript - JavaScript display 属性只影响前 3 个元素