如何解决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
(例如onPageStarted
、onPageFinished
、onProgressChanged
、{{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 举报,一经查实,本站将立刻删除。