OS X 中每个 WebView 的单独 cookie jar

Posted

技术标签:

【中文标题】OS X 中每个 WebView 的单独 cookie jar【英文标题】:Separate cookie jar per WebView in OS X 【发布时间】:2015-04-11 23:13:52 【问题描述】:

我一直在努力实现在 macOS 中为每个 WebView 拥有一个唯一(非共享)cookie jar 的目标(ios 的 cookie 管理工作方式不同)。

在阅读了大量 *** 问题并深入研究文档后,我在这些文章中找到了最接近我的问题的解决方案:

(how to handle HTTP cookies) (how to handle javascript document.cookie cookies)

我已经使用它们设置了一个示例应用程序:https://github.com/jjconti/swift-webview-isolated

基本思想是从 WebResourceLoadDelegate 和 WebPolicyDelegate 协议中实现必要的方法,并使用 BSHTTPCookieStorage 来存储和检索 cookie。此外,我的示例应用程序允许保存 cookieStorage 对象,以便在以后的执行中重新加载它。

很遗憾,该应用程序无法在每个网站上正常运行(文章作者针对的是一个特定网站)。例如 Gmail 和 NewRelic,您在登录后(或执行某些操作后)会立即注销。这让我怀疑 cookie 存储实现中有一个我还没有找到的错误。

有人可以告诉我我是否缺少某些东西吗?

【问题讨论】:

我刚刚尝试了您的示例,并且能够登录 Gmail,浏览不同的标签和 Gmail 设置。转到其他页面然后返回 Gmail 也不需要重新登录。您采取了哪些措施来退出? 在示例的当前状态下,您会收到一条红色标记的消息,说明您尚未登录(但您已登录)并且聊天未加载。如果您取消注释此行 (github.com/jjconti/swift-webview-isolated/blob/master/…) 以启用 document.cookie cookie 处理,您将在登录后注销。 我认为问题可能出在您拨打handleWebscriptCookies 时。尝试在所有帧完成加载后调用它,而不是仅在 NavigationAction 之前调用它 WebKit.framework 不提供单独的 cookie 处理解决方案。它使用默认的共享 Cookie。如果您需要单独的 cookie,则必须找到其他人已经编写的内容或自己编写的内容。没有简单的任务。 @subzero 我们确实做到了。这里我们解释一下screensaver.ninja/2015/12/04/… 【参考方案1】:

问题是没有 JS 级别的 cookie 隔离。 document.cookie 仍然指向共享的 cookie jar。要实现真正的 cookie 隔离 webview,您必须覆盖 document 的 cookie 属性。

你可以试试我的实现: http://cyyuen.github.io/ADCookieIsolatedWebView

它适用于使用 document.cookie 获取 cookie 的站点,例如 Dropbox.com。但是,setter 没有实现。

【讨论】:

以上是关于OS X 中每个 WebView 的单独 cookie jar的主要内容,如果未能解决你的问题,请参考以下文章

WebKit 的 WebView (OS X) 是不是能够显示 docx 文件?

Android tv:标题片段中每个项目的 Webview

Android webview +javascript 未在 android 4.0.x,3.x 中显示输出

Mavericks 上的 OS X 服务器是不是需要单独的 Mac

OS之os.fork()

Adobe AIR 全屏(OS X Mavericks)菜单栏