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 webview +javascript 未在 android 4.0.x,3.x 中显示输出