我想从WKWebView获取所有COOKIE.为什么?我已经启动了一个使用基于Web的身份验证的项目.因此,我应该拦截COOKIE以确保用户已登录并用于其他目的.另一种情况 – 想象一下,如果用户登录,而不是“杀死”应用程序 – 由于存储此COOKIE会话的一些延迟将丢失:(.
The problem seems to be that the COOKIEs are cached and not saved out
to a file immediately.
(@Kemenaran从here – 下面第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作为here.但是我的项目应该支持iOS 9
>我100%肯定,在登录后5-10秒,所需的COOKIE将保存到NSHttpCOOKIEStorage(至少我几天的所有测试都确认了)
>我尝试使用提供的观察者NSHTTPCOOKIEManagerCOOKIEsChangedNotification,但它只为webView中的COOKIE提供回调:decisionPolicyForNavigationResponse:decisionHandler
>我也尝试使用像here中提到的一些JS来获取COOKIE,并且还测试了here的所有建议 – 顺便说一句,这篇文章非常精彩.结果 – 消极
>我也发现了这个radar bug,以及SO question和Sample project,但我想防止这种情况. (在这篇文章中描述的不仅适用于删除而且适用于保存)此情况也是如此,当用户终止应用程序时,用户登录,杀死应用程序和重新启动的情况可能会出现.并且防止这种情况(简单地通过检查NSHttpCOOKIEStorage来获取所需的COOKIE也不是一个好主意,因为完全在登录后需要COOKIE可以存储一些延迟,所以这种方法需要一些bool驱动的解决方案,看起来很奇怪..
>我还阅读了一些相关问题的SO帖子,最有用的是
但仍然没有好的解决方案……
那么,是否存在获取或至少强制立即存储COOKIE的方法?