7

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

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

(虽然只是为了确保它们被删除,但它只运行一次)

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

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

4

3 回答 3

10

问题似乎是 cookie 被缓存并且没有立即保存到文件中。

我制作了一个示例项目来重现此问题 - 并发现它只会在应用程序接收到 SIGKILL 信号时发生,例如当调试器从 Xcode 中停止时。在我的实验中,未处理的异常、崩溃、exit() 和 abort() 不会导致 NSHTPPCookieStorage 丢失数据。

由于这看起来像是一个仅限调试的问题(仅在使用调试器时发生),所以我关闭了之前填写的雷达。

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

于 2013-03-04T10:01:45.407 回答
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 );
于 2012-04-07T12:21:47.150 回答
1

我发现以下代码可以工作。

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

for (NSHTTPCookie *cookie in cookieJar)
{
    [storage deleteCookie:cookie];
}
于 2012-02-08T00:49:08.227 回答