我想从 WKWebView 获取所有 cookie。为什么?我已经开始了一个使用基于网络的身份验证的项目。因此,我应该拦截 cookie 以确保用户已登录并用于其他目的。另一种情况 - 想象如果用户登录,然后他“杀死”应用程序 - 由于存储此 cookie 会话的一些延迟将丢失:(。
问题似乎是 cookie 被缓存并且没有立即保存到文件中。
(@Kemenaran 从这里- 下面第 5 页)
我试图抓住他们的地方——
webView:decidePolicyForNavigationResponse:decisionHandler:
,
func webView(webView: WKWebView, decidePolicyForNavigationResponse navigationResponse: WKNavigationResponse, decisionHandler: (WKNavigationResponsePolicy) -> Void) {
if let httpResponse = navigationResponse.response as? NSHTTPURLResponse {
if let headers = httpResponse.allHeaderFields as? [String: String], url = httpResponse.URL {
let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(headers, forURL: url {
for cookie in cookies {
NSHTTPCookieStorage.shared.set(cookie)
}
}
}
}
但并非所有请求都是导航,因此会跳过一个 cookie(在我的情况下),请参阅下面的详细信息
关于我尝试过的其他选项的几句话......
- 是的,我知道从 iOS 11 开始,我们可以在这里
WKHTTPCookieStore
提及。但我的项目应该支持 iOS 9+
我 100% 确定,在登录后 5-10 秒后,所需的 cookie 将被保存到
NSHttpCookieStorage
(至少我在几天内的所有测试都证实了这一点)我尝试使用提供的观察者
NSHTTPCookieManagerCookiesChangedNotification
,但它只为包含在其中的 cookie 提供回调webView:decidePolicyForNavigationResponse:decisionHandler
我还尝试使用此处提到的一些 JS 获取 cookie ,并测试此处的所有建议- 顺便说一下,这篇文章真的很棒。结果 - 否定
我还发现了这个雷达错误、这个SO 问题和示例项目,但我什至想阻止这种情况。(在这篇文章中描述的不仅适用于删除,而且适用于保存)这种情况也是如此,当用户杀死应用程序时,可能会出现用户登录、杀死应用程序和重新启动的情况。并防止这种情况(简单地通过检查
NSHttpCookieStorage
所需的 cookie 也不是一个好主意,因为在登录后需要的 cookie 可以存储一些延迟,所以这种方法需要一些bool-powered
解决方案,这看起来很奇怪..我还阅读了一些关于一些相关问题的 SO 帖子,最有用的是
但仍然没有好的解决方案...
那么,是否存在任何获取或至少强制立即存储 cookie 的方法?