Понимание политики принятия cookie iOS

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

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

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

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

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

И следующее: - (void) setCookieAcceptPolicy: (NSHTTPCookieAcceptPolicy) aPolicy

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

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

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

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

Edit

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

Ответы

Ответ 1

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

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

Изменит мои приложения соответственно, но не повлияет на Safari. Кроме того, изменение одного приложения не повлияло ни на какие другие приложения.

Ответ 2

Ваше наблюдение, похоже, сохраняется и на 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 и закрыть эту проблему здесь также на s.o.)

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