【问题标题】:Why doesn't NSHTTPCookieStorage save cookies correctly?为什么 NSHTTPCookieStorage 不能正确保存 cookie?
【发布时间】: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 中删除。

标签: iphone cookies


【解决方案1】:

存在三种与 URL 请求相关的本地存储机制,它们会影响身份验证挑战的处理方式:(显然)NSHTTPCookieStorageNSURLCredentialStorageNSURLCacheNSURLCredentialStorage 可能是您应该关注的下一个地方,但清除所有缓存通常被认为是获得您想要的效果的最可靠方法。

这个 sn-p 很方便:https://gist.github.com/559071(清除所有缓存)。

【讨论】:

  • 试过了。如果我在执行删除后立即查看 [NSHTTPCookieStorage cookies],它们就消失了;但是当我再次打开应用程序时,[NSHTTPCookieStorage cookies] 有它最初拥有的 cookie!
  • 抱歉,我以为您为此实施了不同的机制。我有另一个想法...
  • 编辑了我原来的答案。希望对您有所帮助。
  • 我之前没有尝试过清除 NSURLCredentialStorage,但不幸的是我仍然看到相同的行为。 ://
  • 所以 connection:didReceiveAuthenticationChallenge: 只被调用一次,即使你清除了所有的缓存?
【解决方案2】:

Nick,我假设您正在使用 XCode 3.x 构建 IOS 4.x SDK。这可能是一个长镜头,但您提到您关闭了应用程序,然后重新启动它。从 IOS 4.x 开始,iPhone 应用程序默认启用多任务处理。这意味着无论您是否愿意,只要您像往常一样简单地关闭它,您的应用程序都将保留在内存中。解决这个问题的方法是进入您的 app-name-Info.plist 并将“应用程序不在后台运行”键添加到列表中。然后勾选复选框。我建议您在保存项目后此时进行全面清理和构建。此外,如果您在模拟器中运行,建议您通过从应用程序下拉菜单中选择“iPhone 模拟器”然后“重置内容和设置”来完全重置模拟器。

【讨论】:

  • 是我(比尔)提出了最初的问题:)
【解决方案3】:

我也遇到了同样的问题,我通过使用 NSUserDefaults 解决了它。

请参考this link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多