Состояние NSHTTPCookieStorage не сохраняется при выходе из приложения.Какие-нибудь окончательные знания / документация там? - PullRequest
54 голосов
/ 30 апреля 2011

Борясь с этой проблемой и не желая внедрять собственную систему управления файлами cookie.

Похоже, что скрытый уровень реализации HTTP в iOS не позволяет должным образом управлять файлами cookie без сессии.Каждый раз, когда HTTP-ответ устанавливает или удаляет файл cookie, немедленная проверка файлов cookie NSHTTPCookieStorage даст ожидаемые результаты и укажет правильное значение sessionOnly.

Но если приложение закрывается вскоре после того, как ответ обновляет файлы cookie, при повторном запуске этих sessionOnly= Ложные куки-файлы будут возвращены в какое-то предыдущее состояние, а последние обновления будут потеряны.

Независимо от того, установлены или удалены куки-файлы заголовком ответа или NSHTTPCookieStorage setCookie: без разницы.

Некоторое кэширование/ Синхронизация вуду должно происходить за кулисами.Время, в течение которого куки становятся постоянными, может составлять до 5 секунд.

Кто-нибудь, кто имеет или может указать на какое-то определенное объяснение этого поведения?Это ошибка, простая и понятная?Или какая-то недокументированная функция, цель которой я не могу понять?

Какой-то код, который вы можете использовать для воспроизведения:

- (void)applicationDidBecomeActive:(UIApplication *)application
{

    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

    NSHTTPCookie *cookie;
    for (cookie in [NSHTTPCookieStorage sharedHTTPCookieStorage].cookies) {
        NSLog(@"%@=%@", cookie.name, cookie.value);
    }

    NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
    [cookieProperties setObject:@"testCookie" forKey:NSHTTPCookieName];
    [cookieProperties setObject:[NSString stringWithFormat:@"%f", [[NSDate date] timeIntervalSince1970]] forKey:NSHTTPCookieValue];
    [cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieDomain];
    [cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieOriginURL];
    [cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
    [cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];

    // set expiration to one month from now
    [cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];

    cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];

}

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

Некоторые возможные вопросы о переполнении стека:

iphone NSHTTPCookieStorage доступен при повторном открытии приложения?

iPhone: NSHTTPCookie не сохраняется при перезапуске приложения

NSHTTPCookies отказываются быть удаленными

удалено NSHTTPCookie возвращается, если приложениепрекращено

Ответы [ 3 ]

25 голосов
/ 18 марта 2013

Я думаю, что ответ лежит в одном сообщениях SO, связанных с вашим вопросом:

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

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

Вы можете проверить это, перезагрузив телефон в обычном режиме и убедившись, что все изменения в NSHTTPCookieStorage правильно сохранены и перезагружены.

14 голосов
/ 26 марта 2013

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

1) Сохраняйте файлы cookie при их создании uiwebview.

 NSMutableArray *cookieArray = [[NSMutableArray alloc] init];
    for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
        [cookieArray addObject:cookie.name];
        NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
        [cookieProperties setObject:cookie.name forKey:NSHTTPCookieName];
        [cookieProperties setObject:cookie.value forKey:NSHTTPCookieValue];
        [cookieProperties setObject:cookie.domain forKey:NSHTTPCookieDomain];
        [cookieProperties setObject:cookie.path forKey:NSHTTPCookiePath];
        [cookieProperties setObject:[NSNumber numberWithInt:cookie.version] forKey:NSHTTPCookieVersion];

        [cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];

        [[NSUserDefaults standardUserDefaults] setValue:cookieProperties forKey:cookie.name];
        [[NSUserDefaults standardUserDefaults] synchronize];

    }

    [[NSUserDefaults standardUserDefaults] setValue:cookieArray forKey:@"cookieArray"];
    [[NSUserDefaults standardUserDefaults] synchronize];

2) Теперь создайте их зановокак приложение перезагружается:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    NSMutableArray* cookieDictionary = [[NSUserDefaults standardUserDefaults] valueForKey:@"cookieArray"];
     NSLog(@"cookie dictionary found is %@",cookieDictionary);

    for (int i=0; i < cookieDictionary.count; i++) 
{


        NSLog(@"cookie found is %@",[cookieDictionary objectAtIndex:i]);
        NSMutableDictionary* cookieDictionary1 = [[NSUserDefaults standardUserDefaults] valueForKey:[cookieDictionary objectAtIndex:i]];
        NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieDictionary1];
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];


 }

    // other code

}

спасибо

5 голосов
/ 18 ноября 2011

Звучит так, как будто требуется базовый вызов синхронизации типа NSUserDefaults. Я думаю, что ваш лучший способ - это управлять всеми файлами cookie вашего приложения отдельно в стандартных NSUserDefaults и синхронизировать все отсутствующие файлы с файлами в NSHTTPCookieStorage при запуске. Или посмотрите, есть ли какой-то частный метод синхронизации, если вы чувствуете себя смелым:)

...