NSHTTPCookie拒绝被删除

时间:2011-04-21 16:28:50

标签: objective-c ios cocoa-touch cookies nshttpcookie

我的应用需要一个退出按钮,我有以下代码:

        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(我知道你不应该这样做,但我现在正在尝试任何事情)

3 个答案:

答案 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];
}