我的应用需要一个退出按钮,我有以下代码:
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(我知道你不应该这样做,但我现在正在尝试任何事情)
答案 0 :(得分:10)
问题似乎是cookie被缓存而不是立即保存到文件中。
我做了一个sample project来重现这个问题 - 并且发现它只会在应用程序收到SIGKILL信号时发生,就像调试器在Xcode中停止时一样。在我的实验中,未处理的异常,崩溃,exit()和abort()不会导致NSHTPPCookieStorage丢失数据。
由于这看起来只是一个调试问题(只有在使用调试器时才会发生),我关闭了之前填充的 radar。
我无法测试所有内容:随意使用示例项目来查看其他崩溃源是否会导致cookie丢失。
答案 1 :(得分:3)
问题似乎是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 );
答案 2 :(得分:1)
我找到了以下代码。
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookieJar = [storage cookies];
for (NSHTTPCookie *cookie in cookieJar)
{
[storage deleteCookie:cookie];
}