微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CookieManager.getCookie() 总是返回 null (Version <= API 28 (Pie))

如何解决CookieManager.getCookie() 总是返回 null (Version <= API 28 (Pie))

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

cookie 具有以下特点:

  • HTTPS 网址结构如: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 中的 web 应用程序按预期工作这一事实表明 cookie 必须存在于某处。

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

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

已经尝试过的东西:

  • 在来自 CookieManager.getCookie("https://api.example.com")WebChromeClient 的不同事件挂钩上调用方法 WebViewClient(例如 onPageStartedonPageFinishedonProgressChanged、{{1 }},shouldInterceptRequest)
  • 在不同位置使用 shouldOverrideUrlLoading 将 cookie 从内存刷新到持久存储。
  • 通过拦截流量来提取 cookie(使用现有的钩子太黑了)

假设:

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

解决方法

当使用低于 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。