在 iOS 应用中的 WKWebView 和 Alamofire API 调用下管理单独的 cookie 和会话

Managing separate cookies and session under WKWebView and Alamofire API calls in iOS app

我们想要实现的目标

在我们的 iOS 应用程序中,我们有两种处理网站调用的不同功能:

  1. 在 WKWebView 中,我们正在加载特定的网站,用户可以在其中登录他们的帐户,然后我们解析页面以处理数据。
  2. 我们正在从 Alamofire 调用 同一网站 的另一个网页来执行某些操作(作为匿名用户) 并解析数据。

问题

在用户使用第一个功能登录网站之前,第二个功能一切正常。问题是会话以某种方式被共同管理,第二个功能对用户帐户执行操作,而不是作为匿名用户执行!

经过一些研究,我们得知在iOS中,cookies是在HTTPCookieStorage. Thus, when user logs in under WKWebView, it creates a session in HTTPCookieStorage and those cookies are being used (internally) in Alamofire call (which converts expected anonymous website call into user identifiable call). According to this下管理的,似乎Alamofire也在同一个HTTPCookieStorage下管理cookies。

我们尝试过的

在API通过Alamofire 调用之前,我们备份了某个变量中的所有cookie,并从HTTPCookieStorage 中删除了所有cookie。然后,我们启动 API 调用并完成工作(希望它将管理新的 cookie,这些 cookie 将作为匿名用户执行操作)。最后,我们将备份的 cookie 恢复到 HTTPCookieStorage。这样,当用户访问 WKWebView 上的同一站点时,会话保持原样,他们不必再次登录(工作正常)!但即使在清除 cookie 存储之后,新的自动生成的 cookie(在 API 调用期间)也会以某种方式识别该网站上的用户,并且在该用户的帐户中执行操作而不是匿名调用!

那么,我们如何在 Alamofire 和 WKWebView 下管理两个不同的会话来避免这个问题呢?我们可以使用 WKHTTPCookieStorage 做点什么吗?

我们发现了问题!

在 WebView 中,有一个 Timer 每 0.5 秒评估一次 JavaScript(无限)并且当屏幕结束时该计时器没有失效.由于该用户会话一直在后台维护,因此即使我们正在清除 cookie,它也会影响 API。

我们在屏幕结束时使该计时器无效,并解决了问题。