NSHTTPCookies отказываются от удаления
Мне нужна кнопка выхода из системы для моего приложения, у меня есть код ниже:
while ([[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies] count] != 0) {
for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
}
}
(в то время как время только для того, чтобы убедиться, что они будут удалены, он работает только один раз)
Если после описанного выше кода я описываю общее хранилище cookie, то выводит, что массив пуст. Однако я закрываю приложение или просто закрываю его, а затем, после запуска приложения, NSLog описывает общее хранилище файлов cookie, все файлы cookie все еще там.
Я пробовал настройку Cookie
к нулю в цикле for, и даже пытался отправить dealloc в куки (я знаю, что вы не должны этого делать, но сейчас я пытаюсь что-нибудь)
3 ответа
Кажется, проблема в том, что куки кэшируются, а не сохраняются в файл сразу.
Я сделал пример проекта для воспроизведения этой проблемы - и обнаружил, что это произойдет только тогда, когда приложение получит сигнал SIGKILL, например, когда отладчик остановлен из Xcode. В моих экспериментах необработанные исключения, сбои, exit() и abort() не приводили к потере данных NSHTPPCookieStorage.
Поскольку это похоже на проблему только для отладки (это происходит только при использовании отладчика), я закрыл радар, который я заполнил ранее.
Хотя я не смог все протестировать: не стесняйтесь использовать пример проекта, чтобы посмотреть, может ли другой источник сбоев вызвать потерю куки.
Кажется, проблема в том, что куки кэшируются, а не сохраняются в файл сразу.
Если вы добавите звонок в [storage _saveCookies]
тогда это работает - они ушли навсегда, даже если вы сразу же завершите работу приложения. Конечно, этот метод является частным API, поэтому он не поможет вам в App Store. Было бы хорошо найти способ вызвать его!
Я также обнаружил, что следующий интерфейс CoreFoundation API работает хорошо, но, к сожалению, Apple также не предоставляет его:
extern CFTypeRef _CFHTTPCookieStorageGetDefault();
extern void CFHTTPCookieStorageDeleteAllCookies( CFTypeRef storage );
extern void CFHTTPCookieStorageSyncStorageNow( CFTypeRef storage );
...
CFTypeRef storage = _CFHTTPCookieStorageGetDefault();
CFHTTPCookieStorageDeleteAllCookies( storage );
CFHTTPCookieStorageSyncStorageNow( storage );
Я нашел следующий код для работы.
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookieJar = [storage cookies];
for (NSHTTPCookie *cookie in cookieJar)
{
[storage deleteCookie:cookie];
}