问题标签 [android-cookiemanager]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
437 浏览

android - CookieManager.getCookie() 始终返回 null(版本 <= API 28 (Pie))

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 不完整?
0 投票
0 回答
185 浏览

android - Android CookieManager.setCookie 不会跨不同进程同步?

在Android中,我们可以有不同的进程(例如另一个进程中的一个服务)

但是,我注意到 CookieManager(来自 android.webkit.CookieManager)不会在整个过程中同步其新设置的 Cookie。

我在 MainActivity 中有一个设置 Cookie 的函数

如果我在 MainActivity 或 MainService(同一进程中的服务)中读取它,那么我可以读取它。

但是,如果我在OtherService(另一个进程中的服务)中读取它,那么它可能不会得到它。

为了清楚地证明这一点,我创建了一个应用程序,如下所示。您可以在此处获取代码

在此处输入图像描述

1.全新安装应用

  1. 安装新创建的应用程序
  2. 点击Main Process Service:Log(TrackingMe)显示没有Cookie Set<正确>
  3. 点击Other Process Service:Log(TrackingMe)显示没有Cookie Set<正确>
  4. 点击 Write Cookie 将 cookie 写入 CookieManager
  5. 点击Main Process Service:Log(TrackingMe)显示Cookie Set<正确>
  6. 点击Other Process Service:Log(TrackingMe)显示没有Cookie Set<不正确>

2.杀死应用程序并重新启动应用程序

  1. 杀死并重新启动应用程序(不要删除应用程序数据)
  2. 点击Main Process Service:Log(TrackingMe)显示Cookie Set<正确>
  3. 点击Other Process Service:Log(TrackingMe)显示Cookie Set<正确>
  4. 点击 Clear Cookie 将所有 Cookie 清空到 CookieManager
  5. 点击Main Process Service:Log(TrackingMe)显示没有Cookie Set<正确>
  6. 点击Other Process Service:Log(TrackingMe)显示Cookie Set<不正确>

这一发现

  • 其他进程服务不会从 CookieManager 获取更新的 cookie。只能在App被杀死并重启后才能获得。

问题:

  • 我们如何让其他进程服务立即从 CookieManager 获取 Cookie?(无需重启App?)
0 投票
0 回答
33 浏览

android - Android WebView Cookie 清除问题

我正在通过 WebView 加载 Web 应用程序。我想从移动设备上注销该 Web 应用程序。所以我已经实现了删除所有cookie。并且注销按预期工作,因为如果我们再次尝试打开 WebView,它会导致登录。

但问题是如果我们在注销后重新登录,大多数时候它会显示一个空白屏幕。

我实现的代码如下:

请向我建议一些可能性。

0 投票
0 回答
41 浏览

android - Android Webview打开Chrome浏览器接受Cookie

我想在 webview 中显示 Google Page

我已经使用了这些选项

但不是页面打开 Chrome 带有对话框的页面接受 cookie。如何在不显示接受 cookie 窗口的情况下自动强制接受 cookie,或者至少在不可能的情况下确保该窗口在 App 本身中打开?

0 投票
0 回答
14 浏览

java - Android中android.webkit.CookieManager的removeAllCookies()方法的作用

我是软件开发的新手(特别是 Android 应用程序开发),并且面临以下两个关于 removeAllCookies() 的查询:

  1. 假设网站 A 将其 cookie 存储在我的设备上。我正在编写代码以在我的 WebView 上加载另一个网站,例如网站 B。如果在我的代码中执行 removeAllCookies(null),这是否意味着网站 A 的 cookie 也会被删除?如果是,这不是一个坏习惯吗?如果不是,removeAllCookies 怎么知道哪些 cookie 属于网站 B?

  2. 理想情况下,任何 cookie 的键值都应该是网站名称,对吗?

提前致谢!