2013-09-23 3 views
16

Документы Apple о политике принятия cookie для NSHTTPCookieStorage сбивают с толку.Понимание политики принятия cookie iOS

Это то, что говорят документы:

NSHTTPCookieStorage реализует одноплодную объект (общий экземпляр), который управляет хранением печенья. Каждый файл cookie представлен экземпляром класса NSHTTPCookie. Как правило, файлы cookie совместно используются всеми приложениями и сохраняются в синхронизации по границам процесса. Файлы cookie сеанса (когда метод isSessionOnly объекта cookie возвращает ДА) являются локальными для одного процесса и не используются совместно.

iOS Примечание: Файлы cookie не распространяются среди приложений в iOS.

Примечание: Изменения, внесенные в политику принятия cookie, влияют на все текущие приложения, использующие хранилище файлов cookie.

И следующее о - (Недействительными) setCookieAcceptPolicy: (NSHTTPCookieAcceptPolicy) aPolicy

по умолчанию куки принять политику является NSHTTPCookieAcceptPolicyAlways. Изменение политики cookie влияет на все текущие приложения, использующие хранилище файлов cookie.

Теперь моя первая мысль заключалась в том, что приложение должно было вызвать setCookieAcceptPolicy, изменение повлияло бы на другие запущенные приложения. Это, похоже, не так. Вызов setCookieAcceptPolicy повлияет только на приложение, которое его вызвало.

Единственная политика cookie, которая применяется ко всем работающим приложениям, - это Safari. В iOS 7 до того, как приложение вызывает setCookieAcceptPolicy, оно использует политику сафари. Поэтому, если политика cookie сафари настроена всегда на блокировку, любое приложение не сможет использовать файлы cookie до тех пор, пока не установит свою собственную политику файлов cookie. Я понимаю, что это вызвало проблемы для многих приложений, так как вышел iOS 7.

Является ли мое наблюдение правильным обо всем этом, или я что-то пропустил?

Редактировать

Я поднял ошибка с Apple, и ждать, чтобы услышать от них сейчас.

+0

Я не могу воспроизвести эту проблему. Я использую iPod с iOS 7.0.4. После того, как я установил политику cookie в настройке Safari, чтобы всегда блокировать и перезапускать мое приложение, которое не устанавливает политику принятия cookie, политика accept cookie по-прежнему остается 'NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain'. –

ответ

14

Я запустил некоторые тесты в своем приложении и обнаружил, что в iOS 7 политика cookie по умолчанию для приложений задана политикой cookie Safari. Изменение политики cookie в Safari, убийство, а затем перезапуск моих приложений также изменило бы политику файлов cookie в моих приложениях. Добавление следующей строки в мой каждый из моих приложений:

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; 

изменит свои приложения соответственно, но не оказывает никакого влияния на сафари. Кроме того, изменение одного приложения, похоже, не повлияло ни на одно из моих приложений.

+2

Я сделал то же самое, и он работает :) это должно быть полезно для делегата приложения :) – PedroAGSantos

+0

Будет ли его устанавливать только в 'applicationDidFinishLaunching', или другое приложение изменит политику файла cookie, когда приложение будет зашифровано? – jungziege

+0

Я не тестировал его, но если приложение действительно работает в фоновом режиме (в отличие от некоторых других фоновых режимов), он должен иметь возможность устанавливать свою собственную политику файлов cookie. Кроме того, не уверен, правильно ли я прочитал вопрос, но приложение может изменить только свою политику cookie, а не политику другого приложения. Единственным исключением является Safari, который изменяет политику cookie по умолчанию. – user503821

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 так, что вы не попали, что «если» (в случае, если вы хотите, чтобы отметить функцию в Apple BugReporter закрыто и цементировать вопрос здесь так же)

На 8,4 я NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain, по крайней мере, на эфемерном сеансе. Политика Safari cookie в моем случае - «Разрешить с веб-сайтов, которые я посещаю». Не так тонко меняя его на «Разрешить только с текущего сайта» дает тот же самый NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain. , как и установка «Всегда блокировать». Нижняя строка заключается в том, что по умолчанию ios 8 отличается от ios 9 и, похоже, не зависит от выбора политики cookie сафари.

Смежные вопросы