NSHTTPCookies拒绝删除

我的应用程序需要一个注销按钮,我有以下代码:

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

(只是在那里确保它们被删除,但它只运行一次)

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

我已经尝试在for循环中将Cookie设置为nil,甚至尝试将dealloc发送到cookie(我知道你不应该这样做,但我现在正在尝试任何事情)

问题似乎是cookie被缓存而不是立即保存到文件中。

我做了一个示例项目来重现这个问题 – 并且发现它只会在应用程序收到SIGKILL信号时发生,就像调试器在Xcode中停止时一样。 在我的实验中,未处理的exception,崩溃,exit()和abort()不会导致NSHTPPCookieStorage丢失数据。

由于这看起来只是一个调试问题(只有在使用调试器时才会发生),我关闭了之前填充的雷达 。

我无法测试所有内容:随意使用示例项目来查看其他崩溃源是否可能导致cookie丢失。

问题似乎是cookie被缓存而不是立即保存到文件中。

如果您添加对[storage _saveCookies]的调用,那么它可以正常工作 – 即使您之后直接终止应用程序,它们也会一直存在。 当然,该方法是私有API,因此它无法帮助您在App Store上。 找到触发它的方法会很好!

我还发现以下CoreFoundation API运行良好 – 但遗憾的是它不会被Apple公开:

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

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

我找到了以下代码。

 NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; NSArray *cookieJar = [storage cookies]; for (NSHTTPCookie *cookie in cookieJar) { [storage deleteCookie:cookie]; }