NSHTTPCookies拒绝被删除

Jon*_*an. 7 cookies cocoa-touch objective-c nshttpcookie ios

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

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

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

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

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

小智 10

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

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

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

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

  • 哦,非常感谢@Kemenaran,我完全迷失了.要测试cookie,请不要从Xcode中删除应用程序并从Xcode中启动此应用程序之前从手机中删除应用程序. (2认同)

小智 5

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

如果您添加一个调用,那么[storage _saveCookies]它就会起作用 - 即使您随后立即终止应用程序,它们也会永远消失。当然,该方法是私有API,因此它不会在App Store上为您提供帮助。要是能找到一些触发它的方法就好了!

我还发现以下 CoreFoundation API 运行良好 - 但不幸的是 Apple 也没有公开它:

extern CFTypeRef _CFHTTPCookieStorageGetDefault();
extern void CFHTTPCookieStorageDeleteAllCookies( CFTypeRef storage );
extern void CFHTTPCookieStorageSyncStorageNow( CFTypeRef storage );
Run Code Online (Sandbox Code Playgroud)

...

CFTypeRef storage = _CFHTTPCookieStorageGetDefault();
CFHTTPCookieStorageDeleteAllCookies( storage );
CFHTTPCookieStorageSyncStorageNow( storage );
Run Code Online (Sandbox Code Playgroud)


小智 1

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

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

for (NSHTTPCookie *cookie in cookieJar)
{
    [storage deleteCookie:cookie];
}
Run Code Online (Sandbox Code Playgroud)