Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何多次清除NSHTTPookie存储中的Cookie?_Objective C_Cocoa_Google App Engine - Fatal编程技术网

Objective c 如何多次清除NSHTTPookie存储中的Cookie?

Objective c 如何多次清除NSHTTPookie存储中的Cookie?,objective-c,cocoa,google-app-engine,Objective C,Cocoa,Google App Engine,我的桌面应用程序连接到托管在Google app engine上的web应用程序。一旦进行身份验证,它将获得一个authtoken cookie,并将其传递给所有未来的请求。这一切都有效 但现在我想加上“注销”。我尝试过这样实现注销: - (void)signOut { NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie *eac

我的桌面应用程序连接到托管在Google app engine上的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似乎没有被删除。从我的应用程序角度来看,它似乎被删除了。。。我向NSHTTPookieStorage询问cookies,它有我的URL,但它没有返回任何内容。但是,如果我尝试发出另一个请求(应该需要authtoken cookie),该请求就会正常工作,我不会得到401响应,也不会再要求我进行身份验证

因此,如果我理解正确,cookies似乎是从我的角度删除的,但它们不是从底层URL加载框架的角度删除的

可能有兴趣的是,问题可能与以下方面有关:

有人知道如何在与web服务交互的应用程序中始终如一地实现“注销”功能吗

谢谢,
Jesse

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

还有:我推荐。您将能够准确地看到网络上正在发生的事情,并准确地知道正在发送或接收哪些cookies。

+(void)clearAllCookies{
NSHTTPPCookieStorage*cookieStorage=[NSHTTPPCookieStorage SharedHTTPPCookieStorage];
适用于(NSHTTPCookie*每个在cookieStorage.cookies中){
[Cookies存储删除Cookie:每个];
}
}
我知道这是一个老问题,但这里有答案。我们目前正在将此应用程序用于清除
UIWebView
的所有cookie(此应用程序只能访问应用程序中的cookie,不能以任何方式共享跨应用程序)

如果只想清除特定的cookie对象,在决定是否要删除它之前,始终可以检查每个cookie对象的属性。例如cookie.name isEqualToString@“somename”

希望这能帮助其他人

编辑:对于某些iOS版本,现在有了一种更简单的方法,有了一种按日期清除cookie的新方法

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
[cookieStorage removeCookiesSinceDate:[NSDate dateWithTimeIntervalSince1970:0]];
SWIFT 4.X版本:(简单多了,一行)


感谢tcpdump链接。我会尝试一下,然后报告我的发现。更好的理论是我在做一些愚蠢的事情,而代码没有做我认为它在做的事情:)。但这是为了你的帮助和tcpdump的建议,这很快告诉了我到底发生了什么。清除NSHTTPookieStorage似乎效果不错。“很明显,这只能访问应用程序中的Cookie,而不能以任何方式共享跨应用程序”-这是怎么明显的?您可能会认为这是一个沙盒,但文档中会说:“NSHTTPCookieStorage实现了一个单例对象(共享实例),它管理共享cookie存储。这些cookie在所有应用程序之间共享,并在跨进程中保持同步。”我的坏。。。下面有一条说明,这不适用于iOS。我不知道我是怎么错过的!嗨,伙计们,不管怎样,只删除“特定”的饼干?例如,仅来自“google.com”的Cookie?NSHTTPCookie具有名称、域等属性。。。所以你可以做一些事情,比如([cookie.domain isEqualToString@“google.com”]){…};嗯……在迭代数组时删除对象真的可以吗?
HTTPCookieStorage.shared.cookies?.forEach(HTTPCookieStorage.shared.deleteCookie)