如何清除NSHTTPCookieStorage中的cookie多一次?

时间:2009-12-05 15:43:23

标签: objective-c cocoa google-app-engine

我的桌面应用程序连接到托管在Google App引擎上的Web应用程序。一旦它进行身份验证,它就会获得一个authtoken cookie,它会传递给所有未来的请求。一切正常。

但现在我想添加“退出”。我试图像这样实现注销:

- (void)signOut {
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    for (NSHTTPCookie *each in [[[cookieStorage cookiesForURL:[NSURL URLWithString:self.serviceRootURLString]] copy] autorelease]) {
        [cookieStorage deleteCookie:each];
    }
    [self clearCredentialStorage];
}

问题是它似乎只是第一次工作。例如,我可以打开我的应用程序。登录。提出一些要求。登出。然后下次我提出请求时,我会被要求再次进行身份验证。好!

但是在我第二次验证问题发生后。身份验证有效。我得到了authtoken cookie。我可以提出要求。但是当我尝试第二次注销(没有重新启动我的应用程序)时,authtoken cookie似乎没有被删除。它似乎从我的应用程序角度删除...我问NSHTTPCookieStorage它有我的URL的cookie,它没有返回。但是,如果我尝试发出另一个请求(应该需要authtoken cookie)请求才能正常工作,我没有得到401响应,我从未被要求再次进行身份验证。

因此,如果我正确理解事物,似乎从我的角度删除了cookie,但它们不会从基础URL加载框架的角度删除。

可能有兴趣,可能问题与:http://www.macworld.com/article/143343/2009/10/safaricookieproblems.html

有关

有没有人知道如何在与网络服务互动的应用中始终如一地实施“注销”功能?

谢谢, 杰西

2 个答案:

答案 0 :(得分:46)

+(void)clearAllCookies {
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    for (NSHTTPCookie *each in cookieStorage.cookies) {
        [cookieStorage deleteCookie:each];
    }
}

我知道这是一个古老的问题,但这是答案。我们目前正在使用我们的应用程序清除UIWebView的所有Cookie(这只能访问您应用中的Cookie,而不是以任何方式共享交叉应用)。

如果您只想清除特定的一次,您可以随时检查每个cookie对象的属性,决定是否要删除它。例如cookie.name isEqualToString @“somename”

希望这可以帮助那些人。

编辑:从某些iOS版本开始,现在有一种更简单的方法,有一种新方法可以按日期清除Cookie。

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
[cookieStorage removeCookiesSinceDate:[NSDate dateWithTimeIntervalSince1970:0]];

SWIFT 4.X版本:(更简单,一个班轮)

HTTPCookieStorage.shared.cookies?.forEach(HTTPCookieStorage.shared.deleteCookie)

答案 1 :(得分:0)

理论:还有其他相关的Cookie不在您服务的URL下,因为某些请求会导致重定向,可能会在您的系统上获取或设置Cookie。

另外:我推荐using tcpdump for debugging。您将能够准确地看到网络上的内容,并确切地知道正在发送或接收的cookie。