首页 > 解决方案 > 在 iOS 应用程序中的 WKWebView 和 Alamofire API 调用下管理单独的 cookie 和会话

问题描述

我们想要达到的目标

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

  1. 在 WKWebView 中,我们正在加载用户可以登录到他们的帐户的特定网站,然后我们解析页面以处理数据。
  2. 我们正在从 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 做点什么吗?

标签: ioscookiesalamofirewkwebviewhttpcookiestorage

解决方案


我们发现了问题!

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

当屏幕完成时,我们使该计时器无效,它解决了问题。


推荐阅读