2011-04-21 94 views
7

我需要一个注销按钮为我的应用程序,我有下面的代码:NSHTTPCookies拒绝被删除

 while ([[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies] count] != 0) { 
      for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) { 
       [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie]; 
      } 
     } 

(的同时,就在那里,以确保他们被删除,只运行一次不过)

如果我在上面的代码之后记录了共享cookie存储的描述,它会输出数组为空的。然而,我终止了应用程序,或者关闭它,然后在应用程序启动后第一件事情就是NSLog对共享cookie存储的描述,所有的cookie仍然存在。

我曾尝试在for循环设置Cookie为零,甚至试图发送的dealloc的饼干(我知道你不应该这样做,但现在我想任何东西)

+0

我刚刚把你的代码放在我当前的项目中。首先,我用'NSLog(@“%@”,[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies])来抛弃cookies;'然后执行你的代码。重新启动。饼干不见了。奇怪! – 2011-04-21 16:37:59

+0

我遇到了同样的问题,现在正在研究它。当我的应用程序假定某些cookie不见了时,它会引发很多冲突。 – casey 2011-09-29 20:19:55

+0

@casey,请回复你的发现(我会给出额外的代表) – 2011-09-29 21:35:00

回答

1

我发现以下代码工作。

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
NSArray *cookieJar = [storage cookies]; 

for (NSHTTPCookie *cookie in cookieJar) 
{ 
    [storage deleteCookie:cookie]; 
} 
+0

建议,这只是起作用的许多SO帖子上出现,但是很具误导性。 @ Kemenaran对这个问题的确切解释,以及何时解决这个问题对于理解这个问题以及如何测试所有情况至关重要。 – Nariman 2013-03-17 20:26:03

3

问题似乎是缓存了cookies,并没有立即保存到文件中。

如果您添加对[storage _saveCookies]的调用,那么它可以工作 - 即使您之后直接终止应用程序,它们也会消失。当然,这种方法是私人API,所以它不会帮助你在App Store上。找到一些触发它的方法是很好的!

我还发现,以下的CoreFoundation API工作得很好 - 但不幸的是它不是由苹果外露:

extern CFTypeRef _CFHTTPCookieStorageGetDefault(); 
extern void CFHTTPCookieStorageDeleteAllCookies(CFTypeRef storage); 
extern void CFHTTPCookieStorageSyncStorageNow(CFTypeRef storage); 

...

CFTypeRef storage = _CFHTTPCookieStorageGetDefault(); 
CFHTTPCookieStorageDeleteAllCookies(storage); 
CFHTTPCookieStorageSyncStorageNow(storage); 
+0

我填写了rdar:// 13293418([openradar](http://openradar.appspot.com/radar?id=2776403))要求公开此API;你可以填写一个副本给它一些重量。 – Kemenaran 2013-02-26 10:06:11

10

的问题似乎是, Cookie被缓存,并不立即保存到文件中。

我做了一个sample project重现此问题 - 并发现,当应用程序接收到一个SIGKILL信号,当调试从在Xcode停止像它会只发生。在我的实验中,未处理的异常,崩溃,exit()和abort()不会导致NSHTPPCookieStorage丢失数据。因为这看起来像一个纯调试问题(它只发生在使用调试器时),所以我关闭了之前填充的 radar

虽然我无法测试所有内容:请随时使用示例项目来查看其他崩溃源是否会触发Cookie丢失。

+2

非常感谢你@Kemenaran,我完全迷失了。要测试cookie,请不要从Xcode中杀死应用程序,并在从Xcode启动此应用程序之前从手机中杀死应用程序。 – 2014-02-06 06:07:54

+0

谢谢,多数民众赞成它。对于OSX:而不是停止使用Xcode的应用程序只需退出它(右键点击应用程序图标)。这确保了cookie被保存 – sust86 2015-06-24 13:07:38