【问题标题】:How to listen for any cookie changes in Android Webview如何监听 Android Webview 中的任何 cookie 更改
【发布时间】:2017-09-11 01:09:39
【问题描述】:

我的应用程序使用 webview 打开一个网页,该网页在网页上进行的某些交互上更新了一些 cookie。现在我想读取那个 cookie 并根据 cookie 的值进行一些 UI 调整。

iOs 有一些 Observers 的实现,可以附加到 cookie 列表并在任何 cookie 更改发生时获取通知。

我正在寻找类似的解决方案,但找不到任何类型的侦听器或可以附加到 cookie 并了解它们何时更新的东西。

我阅读了CookieManagerCookieSyncManger 中的所有内容

https://developer.android.com/reference/java/net/CookieManager.html

https://developer.android.com/reference/java/net/CookieManager.html

但没有任何帮助。

我知道使用 javascript 接口挂钩是一个更好的解决方案,但由于网站已经在生产环境中运行,因此目前无法实施。

【问题讨论】:

    标签: android android-webview


    【解决方案1】:

    我相信你需要更深一层。 CookieStore - https://developer.android.com/reference/java/net/CookieStore.html 是您正在寻找的。您可以创建自己的实现覆盖 add()、get()、remove() 等,并在其中包含自己的回调。

    这里有一个 SO 帖子,其中介绍了如何通过共享首选项支持的实现来做到这一点 - How do I persist cookies when using HTTPUrlConnection?,但您可以自己滚动并随心所欲地支持它。 (是的,它仍然与 Retrofit 相关 - Retrofit and persistent cookie store

    很抱歉,相同的类名,不同的包 - android.webkit.CookieManager 不是 java.net.CookieManager。我查看了android.webkit.CookieManagerandroid.webkit.WebViewFactory 的相关代码。

    CookieManager 由 WebViewFactoryProvider 实例提供。如果没有一些严重的黑客攻击,似乎不可能做你想做的事。

    我还检查了Crosswalk,它有一个XwalkCookieManager。这可能对你有用,但我没有尝试过,它会大大增加你的 APK 大小。

    【讨论】:

    • 我试过了,但它似乎不适用于 webview cookie。用于 webview 的 CookieManager 与 Http 请求不同,我找不到将我的 webview cookie 管理器指向我自己的 CookieStore 的方法。
    • 是的,我昨天去了完全相同的路径,发现完全相同的东西。今天早上我打开线程有很多时间,但没有运气。我不是黑客的粉丝,所以想去强迫团队为我创造一个钩子。非常感谢您的帮助。
    【解决方案2】:

    作为一种解决方法,我在每次调用 onLoadResource 时都会读取 WebViewClient 内的 cookie,并将其与之前的值进行比较。 这比观察者模式更像是一个繁忙的循环,但它对我有用。

    【讨论】:

    • 你能举个例子来说明这个被覆盖的方法onLoadResource吗?
    猜你喜欢
    • 2010-11-07
    • 2011-01-14
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    相关资源
    最近更新 更多