关于NSHTTPCookieStorage的cookie接受政策的Apple文档令人困惑。
这就是文档所说的:
NSHTTPCookieStorage实现管理cookie存储的单例对象(共享实例)。每个cookie由NSHTTPCookie类的实例表示。通常,cookie在所有应用程序之间共享,并跨进程边界保持同步。会话cookie(cookie对象的isSessionOnly方法返回YES)是单个进程的本地进程,不会被共享。
iOS注意:在iOS中的应用程序之间不共享Cookie。
注意:对Cookie接受政策所做的更改会影响使用Cookie存储的所有当前正在运行的应用程序。
以下关于 - (void)setCookieAcceptPolicy:(NSHTTPCookieAcceptPolicy)aPolicy
默认的cookie接受策略是NSHTTPCookieAcceptPolicyAlways。更改cookie策略会影响使用cookie存储的所有当前正在运行的应用程序。
现在我的第一个想法是,如果应用程序调用setCookieAcceptPolicy,则更改将影响其他正在运行的应用程序。情况似乎并非如此。调用setCookieAcceptPolicy只会影响调用它的应用程序。
适用于所有正在运行的应用程序的唯一cookie策略是Safari。在app 7调用setCookieAcceptPolicy之前的iOS 7中,它使用了safari策略。因此,如果将safari cookie策略设置为始终阻止,则任何应用程序在设置自己的cookie策略之前将无法使用cookie。据我所知,自从iOS 7发布以来,这已经为很多应用程序带来了问题。
我的观察是否正确,或者我错过了什么?
修改
我向Apple提出了一个错误,等待现在回复他们。
答案 0 :(得分:14)
我在我的应用上运行了一些测试,发现在iOS 7上,应用的默认Cookie政策设置为Safari的Cookie政策。更改Safari中的cookie策略,查杀,然后重新启动我的应用程序,也会更改我的应用程序中的cookie策略。将以下行添加到我的每个应用中:
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
会相应地更改我的应用,但不会对Safari产生任何影响。此外,更改一个应用程序似乎不会影响我的任何其他应用程序。
答案 1 :(得分:0)
您的观察结果似乎也在8.4上 幸运的是,从7.0开始,可以基于每个会话进行更改:
NSURLSessionConfiguration *configObject = [NSURLSessionConfiguration ephemeralSessionConfiguration];
if(configObject.HTTPCookieAcceptPolicy != NSHTTPCookieAcceptPolicyAlways) {
NSLog(@"default cookie accept policy was %lu", (unsigned long)configObject.HTTPCookieAcceptPolicy );
configObject.HTTPCookieAcceptPolicy = NSHTTPCookieAcceptPolicyAlways;
}
此外,9.0上的默认值似乎是NSHTTPCookieAcceptPolicyAlways 这样你就不会点击那个“如果”(如果你想在苹果bug报告器中标记该功能,并在s.o上解决这个问题)
在8.4上我得到NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain, 至少在短暂的会议上。在我的案例中,Safari cookie政策是“允许我访问的网站”。 不要巧妙地将其改为“仅允许来自当前网站” 产生相同的NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain。 将其设置为“始终阻止”。 底线是ios 8上的默认值与ios 9不同 并且似乎没有受到safari cookie政策选择器的影响。