【问题标题】:Understanding iOS Cookie Accept Policy了解 iOS Cookie 接受政策
【发布时间】:2013-09-27 19:32:26
【问题描述】:

关于 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 提出了一个错误,现在正在等待他们的回复。

【问题讨论】:

  • 我无法重现此问题。我正在使用装有 iOS 7.0.4 的 iPod。在我将 Safari 设置中的 cookie 策略设置为始终阻止并重新启动未设置任何 cookie 接受策略的应用程序后,cookie 接受策略仍然是 NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain

标签: ios cookies


【解决方案1】:

您的观察似乎也适用于 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 这样您就不会遇到那个“如果”(如果您想在 apple bugreporter 中标记该功能已关闭并在此处也解决问题)

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

【讨论】:

    【解决方案2】:

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

    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
    

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

    【讨论】:

    • 我也做了同样的事情,它可以工作 :) 这应该在应用程序委托上使用 :)
    • 仅在applicationDidFinishLaunching 中设置是否有效,或者其他应用程序可以在应用程序后台更改cookie 策略吗?
    • 我还没有测试过,但如果应用程序实际上是在后台运行(与其他一些后台模式相反),它应该能够设置自己的 cookie 策略。此外,不确定我是否正确阅读了问题,但应用只能更改自己的 cookie 政策,而不能更改其他应用的政策。唯一的例外是 Safari,它会更改默认的 cookie 策略。
    • 您在应用程序的哪个位置添加了@user503821 代码行?
    • 在大多数用于启动应用的应用委托方法中,例如 [application didFinishLaunchingWithOptions]
    猜你喜欢
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    相关资源
    最近更新 更多