1

android.webkit.Webview在基于 Java 的原生 android 应用程序中使用标准。在 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()返回和 webapp按预期工作true的事实表明 cookie必须存在于某处。Webview

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

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

已经尝试过的事情:

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

假设:

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

1 回答 1

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

于 2021-01-21T00:31:03.467 回答