【发布时间】: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 下不起作用,我该如何解决?
已经尝试过的事情:
- 在来自
WebChromeClient、WebViewClient(例如onPageStarted、onPageFinished、onProgressChanged、shouldInterceptRequest、shouldOverrideUrlLoading)的不同事件挂钩上调用方法CookieManager.getCookie("https://api.example.com") - 在不同位置使用
CookieManager.flush()将 cookie 从内存刷新到持久存储。 - 通过拦截流量来提取cookie(使用现有的钩子太hacky了)
假设:
- 线程?,低于 28 的 API 支持不完整?
【问题讨论】:
标签: android cookies android-webview android-cookiemanager