了解iOS Cookie接受政策

有关NSHTTPCookieStorage的cookie接受政策的Apple文档令人困惑。

这就是文档所说的:

NSHTTPCookieStorage实现管理cookie存储的单例对象(共享实例)。 每个cookie由NSHTTPCookie类的实例表示。 通常,cookie在所有应用程序之间共享,并跨进程边界保持同步。 会话cookie(cookie对象的isSessionOnly方法返回YES)是单个进程的本地cookie,不共享。

iOS注意:iOS中的应用程序不共享Cookie。

注意:对cookie接受策略所做的更改会影响使用cookie存储的所有当前正在运行的应用程序。

以下关于 – (void)setCookieAcceptPolicy:(NSHTTPCookieAcceptPolicy)aPolicy

默认的cookie接受策略是NSHTTPCookieAcceptPolicyAlways。 更改cookie策略会影响使用cookie存储的所有当前运行的应用程序。

现在我的第一个想法是,如果应用程序调用setCookieAcceptPolicy,更改将影响其他正在运行的应用程序。 这似乎不是这种情况。 调用setCookieAcceptPolicy只会影响调用它的应用程序。

适用于所有正在运行的应用程序的唯一cookie策略是Safari。 在应用程序调用setCookieAcceptPolicy之前的iOS 7中,它使用了safari策略。 因此,如果将safari cookie策略设置为始终阻止,则任何应用程序在设置自己的cookie策略之前将无法使用cookie。 据我所知,自从iOS 7问世以来,这已经为很多应用程序带来了问题。

我的观察是否正确,或者我错过了什么?

编辑

我已经向Apple提出了一个错误,等待现在回复他们。

我在我的应用程序上运行了一些测试,发现在iOS 7上,应用程序的默认cookie策略设置为Safari的cookie策略。 更改Safari中的cookie策略,查杀,然后重新启动我的应用程序,也会更改我的应用程序中的cookie策略。 在我的每个应用中添加以下行:

 [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; 

会相应地更改我的应用程序,但不会对Safari产生任何影响。 此外,更改一个应用程序似乎并没有影响我的任何其他应用程序。

您的观察似乎保持在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,因此您不会点击“if”(如果您想要在apple bugreporter中标记该function并在此处解决此问题)

在8.4我得到NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain,至少在短暂的会话上。 在我的案例中,Safari cookie政策是“允许我访问的网站”。 不那么巧妙地将其更改为“仅允许来自当前网站”会产生相同的NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain。 将其设置为“始终阻止”。 底线是ios 8上的默认值与ios 9不同,并且似乎不受safari cookie策略选择器的影响。