NSHTTPCookies отказываются от удаления - PullRequest
7 голосов
/ 21 апреля 2011

Мне нужна кнопка выхода из системы для моего приложения, у меня есть следующий код:

        while ([[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies] count] != 0) {
            for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
                [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
            }
        }

(хотя он только для того, чтобы убедиться, что они удалены, он запускается только один раз)

Если я NSLog описывает общее хранилище cookie после приведенного выше кода, он выводит, что массив пуст. Однако я закрываю приложение или просто закрываю его, а затем, после запуска приложения, NSLog описывает общее хранилище файлов cookie, все файлы cookie все еще там.

Я попытался установить Cookie в ноль в цикле for и даже попытался отправить dealloc в файлы cookie (я знаю, что вы не должны этого делать, но я сейчас что-то пытаюсь)

Ответы [ 3 ]

10 голосов
/ 04 марта 2013

Кажется, проблема в том, что файлы cookie кэшируются и не сохраняются в файл сразу.

Я создал пример проекта для воспроизведения этой проблемы - и обнаружил, что это произойдет только тогда, когда приложение получит сигнал SIGKILL, например, когда отладчик остановлен из Xcode. В моих экспериментах необработанные исключения, сбои, exit () и abort () не приводили к потере данных NSHTPPCookieStorage.

Поскольку это похоже на проблему только для отладки (это происходит только при использовании отладчика), я закрыл радар , который я заполнил ранее.

Я не смог все протестировать: не стесняйтесь использовать пример проекта, чтобы посмотреть, может ли другой источник сбоев вызвать потерю куки.

3 голосов
/ 07 апреля 2012

Кажется, проблема в том, что куки-файлы кэшируются и не сохраняются сразу в файл.

Если вы добавите вызов к [storage _saveCookies], тогда это сработает - они ушли навсегда, даже если выпрекратить приложение сразу после этого.Конечно, этот метод является частным API, поэтому он не поможет вам в App Store.Было бы неплохо найти способ вызвать его!

Я также обнаружил, что следующий API CoreFoundation работает хорошо, но, к сожалению, он также не предоставляется Apple:

extern CFTypeRef _CFHTTPCookieStorageGetDefault();
extern void CFHTTPCookieStorageDeleteAllCookies( CFTypeRef storage );
extern void CFHTTPCookieStorageSyncStorageNow( CFTypeRef storage );

...

CFTypeRef storage = _CFHTTPCookieStorageGetDefault();
CFHTTPCookieStorageDeleteAllCookies( storage );
CFHTTPCookieStorageSyncStorageNow( storage );
1 голос
/ 08 февраля 2012

Я нашел следующий код для работы.

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookieJar = [storage cookies];

for (NSHTTPCookie *cookie in cookieJar)
{
    [storage deleteCookie:cookie];
}
...