2010-10-30 209 views
4

我的iPhone应用程序中有NSHTTPCookieStorage的一些奇怪的问题。当我在我的Web服务上调用登录操作时,服务会发回一个名为“auth”的授权cookie以及其他一些cookie。为什么NSHTTPCookieStorage不能正确保存cookie?

当我将用户登录出去时,我会在服务器上调用注销操作来删除cookie。如果我在调用注销之前打印[NSHTTPCookieStorage cookies]的结果,我会按预期看到auth cookie。在我注销后,我发现auth cookie不再存在(如预期的那样)。

但是,如果我关闭了应用程序并重新启动它,auth cookie又回来了!

我不确定这里发生了什么事。如果NSHTTPCookieStorage没有保留任何cookie,这将是一回事,但它似乎是挽救了其中的一些。

有谁知道发生了什么事?我需要手动管理Cookie吗?有什么办法将NSHTTPCookieStorage中的内容提交到磁盘?

+0

我也看到相关的行为,如果我从Web请求收到一个cookie,确认它存在,然后在几秒钟后关闭应用程序(并将其从背景托盘中移除),则Cookie不在当我启动应用程序。然而,这并不一致。 – 2010-12-15 01:47:41

+0

abraginsky:不幸的是,这正是我所看到的。我通过将相关cookie保存在NSUserDefaults中并在应用程序启动时从用户默认值填入NSHTTPURLCookieStorage来解决此问题。它完成了这项工作,但是找出NSHTTPCookieStorage有什么问题是很好的。 – Bill 2010-12-15 02:07:07

+0

是的,我看到了相同的解决方法,目前正在努力实施它。在用户从后台托盘中终止应用程序之前,需要确保NSUserDefault正在用cookie快速更新。把它放在“将终止”将不起作用,因为这没有被调用(至少在模拟器中)。 – 2010-12-15 02:33:31

回答

1

存在三种本地存储机制相关的URL请求,这些请求会影响验证质询的处理方式:(明显)NSHTTPCookieStorageNSURLCredentialStorageNSURLCacheNSURLCredentialStorage可能是您应该查看的下一个地方,但清除所有缓存通常被认为是具有所需效果的最可靠方法。

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

+0

试过了。如果我在执行删除操作后立即查看[NSHTTPCookieStorage cookies],它们就消失了;但是当我再次打开该应用程序时,[NSHTTPCookieStorage cookies]拥有它最初拥有的cookie! – Bill 2010-11-03 00:24:12

+0

对不起,我以为你实现了一个不同的机制。我有另一个想法... – 2010-11-03 08:52:11

+0

编辑我的原始答案。希望能帮助到你。 – 2010-11-03 16:46:01

0

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

+0

这是我(比尔)谁问了原来的问题:) – Bill 2010-11-08 12:16:22

0

我也面临同样的问题,我解决了它通过使用NSUserDefaults。请致电this link