【发布时间】:2011-03-25 04:49:20
【问题描述】:
我的 iPhone 应用程序中的 NSHTTPCookieStorage 出现了一些奇怪的问题。当我在我的 Web 服务上调用登录操作时,该服务会发回一个名为“auth”的身份验证 cookie 以及其他一些 cookie。
当我注销用户时,我会在服务器上调用注销操作来删除 cookie。如果我在调用注销之前打印 [NSHTTPCookieStorage cookies] 的结果,我会按预期看到身份验证 cookie。注销后,我看到 auth cookie 不再存在(如预期的那样)。
但是,如果我关闭应用程序并重新启动它,auth cookie 又回来了!
我不确定这里发生了什么。如果 NSHTTPCookieStorage 根本不保存任何 cookie,那将是一回事,但它似乎正在保存其中的一些。
有人知道发生了什么吗?我需要手动管理 cookie 吗?有没有办法将 NSHTTPCookieStorage 中的内容提交到磁盘?
【问题讨论】:
-
我还看到了相关行为,如果我从 Web 请求中收到 cookie,确认它存在,然后在几秒钟后关闭应用程序(并将其从后台托盘中删除),则当我启动应用程序时,cookie 不存在。然而这并不一致。
-
abraginsky:不幸的是,这也是我所看到的。我通过将相关 cookie 保存在 NSUserDefaults 中并在应用启动时从用户默认值中填写 NSHTTPURLCookieStorage 解决了这个问题。它完成了工作,但最好弄清楚 NSHTTPCookieStorage 出了什么问题。
-
是的,我看到了相同的解决方法,目前也在努力实施它。在用户从后台托盘终止应用程序之前,需要确保 NSUserDefault 使用 cookie 更新得足够快。将其放入“将终止”是行不通的,因为它没有被调用(至少在模拟器中)。
-
经过一番挖掘后,似乎这个错误早在 2007 年就出现在 OSX Safari 中。lists.apple.com/archives/macnetworkprog/2007/Apr/msg00001.html
-
将 cookie 保存到 NSUserDefaults 第一次看到它们(新创建的、现有的更新的或现有的过期案例),然后在第一次启动时从 NSUserDefaults 恢复也解决了我的问题。 cookie 过期的情况很棘手,因为 cookie 很可能不再存在于 cookie 存储中,因此应该从 NSUserDefaults 中删除。