16

关于 NSHTTPCookieStorage 的 cookie 接受策略的 Apple 文档令人困惑。

这就是文档所说的:

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

iOS 注意: Cookie 不会在 iOS 中的应用程序之间共享。

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

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

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

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

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

我对这一切的观察是否正确,还是我错过了什么?

编辑

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

4

2 回答 2

14

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

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

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

于 2013-09-28T02:26:56.447 回答
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 ,这样您就不会点击“如果”(如果您想将苹果 bugreporter 中的功能标记为已关闭并在此处巩固问题)

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

于 2015-11-25T09:51:05.587 回答