为什么NSHTTPCookieStorage不能正确保存cookies?

4
我在我的iPhone应用程序中使用NSHTTPCookieStorage遇到了一些奇怪的问题。当我调用Web服务上的登录操作时,服务会发送一个名为“auth”的授权cookie以及其他一些cookie。
当我注销用户时,我在服务器上调用注销操作来删除cookie。如果在调用注销之前打印[NSHTTPCookieStorage cookies]的结果,我会看到预期的auth cookie。注销后,我发现auth cookie不再存在(符合预期)。
然而,如果我关闭应用程序并重新启动它,auth cookie就会回来!
我不确定这里发生了什么事情。如果NSHTTPCookieStorage根本不保存任何cookie,那就没关系了,但它似乎保存了其中一些。
有人知道发生了什么吗?我需要手动管理cookie吗?是否有一种方法将NSHTTPCookieStorage中的内容提交到磁盘上?

我还发现了相关的行为,如果我从Web请求中接收到一个cookie,确认它存在,然后几秒钟后关闭应用程序(并将其从后台托盘中删除),当我重新启动应用程序时,该cookie不在那里。然而,这并不是一致的。 - Ari Braginsky
abraginsky:不幸的是,我也看到了这个问题。我通过将相关的cookie保留在NSUserDefaults中,并在应用程序启动时从用户默认值中填充NSHTTPURLCookieStorage来解决了这个问题。它可以完成工作,但找出NSHTTPCookieStorage的问题会很好。 - Bill
是的,我看到了同样的解决方法,目前正在努力实现它。需要确保在用户从后台托盘终止应用程序之前,NSUserDefault 能够快速更新 cookies。将其放在 "will terminate" 中不起作用,因为这个方法没有被调用(至少在模拟器中)。 - Ari Braginsky
经过一些挖掘,似乎这个 bug 是在 2007 年出现的,与 OSX Safari 有关。http://lists.apple.com/archives/macnetworkprog/2007/Apr/msg00001.html - Ari Braginsky
将cookie保存到NSUserDefaults中,因为它们第一次出现(无论是新创建的、已存在的更新还是已过期的情况),然后在第一次启动时从NSUserDefaults中恢复,这对我也解决了问题。过期的cookie情况比较棘手,因为cookie很可能不再存在于cookie存储中,因此应该从NSUserDefaults中删除。 - Ari Braginsky
3个回答

1

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

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


尝试过了。如果我在执行删除操作后立即查看[NSHTTPCookieStorage cookies],它们就会消失;但是当我再次打开应用程序时,[NSHTTPCookieStorage cookies]中有最初的cookie! - Bill
抱歉,我以为你实现了另一种机制。我有另一个想法... - Nick Toumpelis
修改了我的原始答案。希望能有所帮助。 - Nick Toumpelis
我之前没有尝试过清除NSURLCredentialStorage,但不幸的是,我仍然看到相同的行为。 :/ - Bill
那么,即使您清除了所有缓存,connection:didReceiveAuthenticationChallenge: 只会被调用一次吗? - Nick Toumpelis
认证是在应用程序级别进行的 - 即它不是HTTP身份验证。 - Bill

0

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

请参考这个链接


0
尼克,我假设你正在使用XCode 3.x的IOS 4.x SDK进行开发。这可能有些冒险,但你提到你关闭应用程序然后重新启动它。从IOS 4.x开始,iPhone应用程序默认启用多任务处理。这意味着,无论你是否需要,如果你只是正常地关闭了应用程序,你的应用程序将保留在内存中。为了解决这个问题,你需要进入你的应用名称-Info.plist并将"Application does not run in the background"键添加到列表中。然后在复选框中勾选。我建议在保存项目后执行全面的清理和构建。此外,如果你在模拟器中运行,我建议你通过选择"iPhone模拟器",然后在应用程序下拉菜单中选择"重置内容和设置"来完全重置模拟器。

是我(比尔)提出了最初的问题 :) - Bill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接