【问题标题】:WKWebView, get all cookiesWKWebView,获取所有cookies
【发布时间】:2017-09-22 07:10:31
【问题描述】:

我想从 WKWebView 获取所有 cookie。为什么?我已经开始了一个使用基于网络的身份验证的项目。因此,我应该拦截 cookie 以确保用户已登录并用于其他目的。另一种情况 - 假设用户登录,然后他“杀死”应用程序 - 由于存储此 cookie 会话的一些延迟将丢失:(。

问题似乎是 cookie 被缓存而不是保存出来 立即保存到文件中。

(来自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(在我的情况下),请参阅下面的详细信息

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

  1. 是的,我知道从 iOS 11 开始,我们可以使用 WKHTTPCookieStore 作为提及 here。但我的项目应该支持 iOS 9+

  1. 我 100% 确定,在登录后 5-10 秒后,所需的 cookie 将被保存到 NSHttpCookieStorage(至少我这几天的所有测试都证实了这一点)

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

  3. 我还尝试使用here 中提到的一些 JS 获取 cookie,并测试来自 here 的所有建议 - 顺便说一下,这篇文章真的很棒。结果 - 否定

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

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

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

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

【问题讨论】:

    标签: ios swift wkwebview nshttpcookie nshttpcookiestorage


    【解决方案1】:

    我以简单的“强制”从网页中保存 Cookie 结束。

    要获取我使用的所有 cookie

    stringByEvaluatingJavaScriptFromString

    使用像document.cookie();这样的JS字符串。结果,我能够以带有; 分隔符的字符串接收所有cookie。我需要做的就是解析字符串、创建 cookie 并将其设置为 NSHttpSharedStorage

    【讨论】:

    • 这种方法的问题是您将无法读取 httponly cookie。
    • ` NSDictionary *eventInitDict = @{ @"data": message, }; NSString *source = [NSString stringWithFormat:@"document.dispatchEvent(new MessageEvent('message', %@));", RCTJSONStringify(eventInitDict, NULL) ]; [_webView stringByEvaluatingJavaScriptFromString:source]; `
    • 类似的东西
    猜你喜欢
    • 1970-01-01
    • 2016-01-14
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多