WKWebView,获取所有cookie
WKWebView, get all cookies
我想从 WKWebView 获取所有的 cookies。为什么?我已经开始了一个使用基于网络的身份验证的项目。因此,我应该拦截 cookie 以确保用户已登录并用于其他一些目的。另一种情况 - 想象如果用户登录,然后他 "kill" 应用程序 - 由于存储此 cookie 会话的一些延迟将丢失 :(.
The problem seems to be that the cookies are cached and not saved out
to a file immediately.
(来自 here 的@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
作为提及 here。但是我的项目应该支持iOS 9+
我 100% 确定,登录后 5-10 秒后,所需的 cookie 将保存到 NSHttpCookieStorage
(至少我几天来的所有测试都证实了这一点)
我尝试使用提供的观察者 NSHTTPCookieManagerCookiesChangedNotification
,但它只为 webView:decidePolicyForNavigationResponse:decisionHandler
内的 cookie 提供回调
我也尝试使用提到的一些 JS 获取 cookie here and also test all suggestion from here - 顺便说一下,这真是一篇很棒的文章。结果 - 否定
我也发现了这个radar bug, and this SO question, and Sample project,但我什至想阻止这种情况。 (在此 post 中描述的不仅适用于删除而且适用于保存)这种情况也是如此,当用户终止应用程序时,因此可能会出现用户登录、终止应用程序并重新启动的情况。并防止这种情况(简单地通过检查 NSHttpCookieStorage
所需的 cookie 也不是一个好主意,因为恰好在登录后所需的 cookie 可以延迟存储,所以这种方法需要一些 bool-powered
解决方案,这看起来很奇怪..
我还阅读了一些 SO post 来解决一些相关问题,最有用的是
- This one
但是还是没有很好的解决办法...
那么,是否有任何方法可以获取或至少强制立即存储 cookie?
我以简单的 "force-like" 从网页保存 Cookie 结束。
为了获取我使用的所有 cookie
stringByEvaluatingJavaScriptFromString
JS 字符串如 document.cookie();
。结果,我能够将所有 cookie 作为带有 ;
分隔符的字符串接收。我需要做的就是解析字符串,创建 cookie 并将其设置为 NSHttpSharedStorage
我想从 WKWebView 获取所有的 cookies。为什么?我已经开始了一个使用基于网络的身份验证的项目。因此,我应该拦截 cookie 以确保用户已登录并用于其他一些目的。另一种情况 - 想象如果用户登录,然后他 "kill" 应用程序 - 由于存储此 cookie 会话的一些延迟将丢失 :(.
The problem seems to be that the cookies are cached and not saved out to a file immediately.
(来自 here 的@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
作为提及 here。但是我的项目应该支持iOS 9+
我 100% 确定,登录后 5-10 秒后,所需的 cookie 将保存到
NSHttpCookieStorage
(至少我几天来的所有测试都证实了这一点)我尝试使用提供的观察者
NSHTTPCookieManagerCookiesChangedNotification
,但它只为webView:decidePolicyForNavigationResponse:decisionHandler
内的 cookie 提供回调
我也尝试使用提到的一些 JS 获取 cookie here and also test all suggestion from here - 顺便说一下,这真是一篇很棒的文章。结果 - 否定
我也发现了这个radar bug, and this SO question, and Sample project,但我什至想阻止这种情况。 (在此 post 中描述的不仅适用于删除而且适用于保存)这种情况也是如此,当用户终止应用程序时,因此可能会出现用户登录、终止应用程序并重新启动的情况。并防止这种情况(简单地通过检查
NSHttpCookieStorage
所需的 cookie 也不是一个好主意,因为恰好在登录后所需的 cookie 可以延迟存储,所以这种方法需要一些bool-powered
解决方案,这看起来很奇怪..我还阅读了一些 SO post 来解决一些相关问题,最有用的是
- This one
但是还是没有很好的解决办法...
那么,是否有任何方法可以获取或至少强制立即存储 cookie?
我以简单的 "force-like" 从网页保存 Cookie 结束。
为了获取我使用的所有 cookie
stringByEvaluatingJavaScriptFromString
JS 字符串如 document.cookie();
。结果,我能够将所有 cookie 作为带有 ;
分隔符的字符串接收。我需要做的就是解析字符串,创建 cookie 并将其设置为 NSHttpSharedStorage