【问题标题】:CookieManager.getCookie() always returns null (Version <= API 28 (Pie))CookieManager.getCookie() 始终返回 null(版本 <= API 28 (Pie))
【发布时间】:2021-01-21 08:31:03
【问题描述】:

我在基于 Java 的原生 android 应用程序中使用标准 android.webkit.Webview。 在 Web 视图中,用户登录到 web 应用程序。成功登录后,webapp 会存储一个带有访问令牌的 cookie。我想访问这个 cookie。

cookie具有以下特点:

  • HTTPS URL 结构如:https://api.example.com
  • httpOnly标志
  • Secure标志

在 Android API 级别 29 或 API 级别 30 上,调用 CookieManager.getCookie("https://api.example.com") 会像预期的那样工作,并返回一个包含 Cookie 值的字符串。

在 Android API 级别 28 或更低版本上,调用相同的方法总是返回null。尽管如此,调用CookieManager.hasCookies() 会返回true,而Webview 中的webapp 正在按预期工作这一事实表明cookie 必须 存在于某处。

我需要保留 cookie 以处理未在 Web 视图中执行的“外部”下载和其他 API 调用。

为什么这在 API 28 下不起作用,我该如何解决?

已经尝试过的事情:

  • 在来自WebChromeClientWebViewClient(例如onPageStartedonPageFinishedonProgressChangedshouldInterceptRequestshouldOverrideUrlLoading)的不同事件挂钩上调用方法CookieManager.getCookie("https://api.example.com")
  • 在不同位置使用 CookieManager.flush() 将 cookie 从内存刷新到持久存储。
  • 通过拦截流量来提取cookie(使用现有的钩子太hacky了)

假设:

  • 线程?,低于 28 的 API 支持不完整?

【问题讨论】:

    标签: android cookies android-webview android-cookiemanager


    【解决方案1】:

    使用低于 28 的旧 API 版本时,标准 WebView 实现低于 72,或标准 Chrome Webview。

    在版本 72 中,使用 SameSite 属性解析 Cookie 时存在错误。 作为副作用,CookieManager 不会移交带有 Attribute 的 Cookie。 因此需要在设备上放置更新的 Webview 实现(例如通过 Android WebView 的 PlayStore 更新),否则 getCookie(url) 将始终返回 null。

    这会影响具有默认 Google 图片的模拟器。因此,开发人员可能很难找到这一点。 :)

    更多信息可以在这里找到:https://bugs.chromium.org/p/chromium/issues/detail?id=780491

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 2019-05-05
      • 2016-05-31
      • 2015-08-15
      • 2012-03-18
      相关资源
      最近更新 更多