WKWebView,获取所有cookie

gbk*_*gbk 6 nshttpcookie ios swift wkwebview nshttpcookiestorage

我想从WKWebView获取所有cookie.为什么?我已经启动了一个使用基于Web的身份验证的项目.因此,我应该拦截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)
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但并非所有请求都是导航,因此跳过一个cookie(在我的情况下),请参阅下面的详细信息

在此输入图像描述

关于我试过的其他选项的几句话......

  1. 是的,我知道从iOS 11开始,我们可以在这里WKHTTPCookieStore提到.但我的项目应该支持iOS 9+

在此输入图像描述

  1. 我100%肯定,在登录后5-10秒,所需的cookie将保存到NSHttpCookieStorage(至少我几天的所有测试都确认)

  2. 我尝试使用提供的观察者NSHTTPCookieManagerCookiesChangedNotification,但它只为内部的cookie提供回调webView:decidePolicyForNavigationResponse:decisionHandler

  3. 我也尝试使用这里提到的一些JS来获取cookie ,并从这里测试所有建议- 顺便说一下,这篇文章非常棒.结果 - 消极

  4. 我也发现了这个雷达错误,这个问题Sample项目,但我想防止这种情况.(在这篇文章中描述的不仅适用于删除而且适用于保存)此情况也是如此,当用户终止应用程序时,用户登录,杀死应用程序和重新启动的情况可能会出现.并且防止这种情况(简单地通过检查NSHttpCookieStorage所需的cookie也不是一个好主意,因为在登录后需要cookie可以存储一些延迟,所以这种方法需要一些bool-powered解决方案,看起来很奇怪..

  5. 我还阅读了一些相关问题的SO帖子,最有用的是

但仍然没有好的解决方案......

那么,是否存在获取或至少强制立即存储cookie的方法?

gbk*_*gbk 2

我以简单的“类似强制”的方式从网页中保存 Cookie。

获取我使用的所有 cookie

stringByEvaluatingJavaScriptFromString

与 JS 字符串类似document.cookie();. 结果我能够以带;分隔符的字符串形式接收所有 cookie。我需要做的就是解析字符串,创建 cookie 并将其设置为NSHttpSharedStorage