问题标签 [httpcookiestorage]
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.
ios - 在 iOS 应用程序中的 WKWebView 和 Alamofire API 调用下管理单独的 cookie 和会话
我们想要达到的目标
在我们的 iOS 应用程序中,我们有两个不同的功能来处理网站调用:
- 在 WKWebView 中,我们正在加载用户可以登录到他们的帐户的特定网站,然后我们解析页面以处理数据。
- 我们正在从 Alamofire调用同一网站的另一个网页来执行一些操作(作为匿名用户)并解析数据。
问题
在用户以第一个功能登录网站之前,第二个功能一切正常。问题是会话通常是管理的,第二个功能对用户的帐户执行操作,而不是作为匿名用户执行它!
经过一番研究,我们了解到在 iOS 中,cookie 是在HTTPCookieStorage下管理的。因此,当用户在 WKWebView 下登录时,它会在 HTTPCookieStorage 中创建一个会话,并且这些 cookie 正在(内部)在 Alamofire 调用中使用(它将预期的匿名网站调用转换为用户可识别的调用)。据此, Alamofire似乎也在同一 HTTPCookieStorage 下管理 cookie。
我们尝试过的
在通过 Alamofire 调用 API 之前,我们备份了某个变量中的所有 cookie,并从 HTTPCookieStorage 中删除了所有 cookie。然后,我们启动 API 调用并完成工作(希望它会管理新的 cookie,这些 cookie 将作为匿名用户执行操作)。最后,我们将备份的 cookie 恢复到 HTTPCookieStorage。这样,当用户访问 WKWebView 上的同一站点时,会话保持原样,他们不必再次登录(工作正常)!但即使在清除 cookie 存储之后,新的自动生成的 cookie(在 API 调用期间)以某种方式识别该网站上的用户,并且在该用户的帐户中执行操作,而不是匿名调用!
那么,我们如何在 Alamofire 和 WKWebView 下管理两个不同的会话来避免这个问题呢?我们可以使用 WKHTTPCookieStorage 做点什么吗?
ios - Cookie 存储 HTTPCookieStorage 和 WKHTTPCookieStore 同步问题
社区
我们在存储HTTPCookieStorage和WKHTTPCookieStore之间同步 cookie 时遇到问题,我们希望此资源能够帮助我们解决问题。(苹果开发者论坛还没有得到任何结果)。
关于应用程序和功能:
- URL请求(REST API)
- WKWebView作为应用程序的一部分
- 直接链接到 cookie 的客户环境
- WKWebView和URLRequest都可以更改 cookie
- 所有WKWebView 都使用相同的WKWebSiteDataStore和WKProcessPool(通过WKWebViewConfiguration)。
因此,根据项目功能,我们需要在每次完成请求后检查并同步两个存储中的实际 cookie。
正如我们所知,默认情况下“从盒子里”在这些存储之间存在同步,但是从我们的调试和调查这个功能我们知道,这个“盒子里”同步只在真实设备上工作,不稳定(可能同步或可能不是)并且它在 iOS 11.3 发布之前工作稳定。
我们创建了 CookieSync 管理器,它可以手动同步具有存储优先级的存储之间的 cookie(优先存储 cookie 将同步到其他存储,尽管有值)。对于管理器,我们使用与每个WKWebView对象相同的WKWebSiteDataStore 。
从我们的测试和调试结果来看,我们在同步某些 cookie 方面存在问题,这对我们和我们的客户来说至关重要。
也许有人知道简单正确地同步 cookie 的方法或变体?
最好的问候, Dmytrii Golovanov