Общий экземпляр NSHTTPCookieStorage не сохраняется.

Я разрабатываю приложение, в котором сервер передает мне cookie для идентификации пользователя.

Мои последовательные запросы должны иметь этот файл cookie для ответа, который ожидает пользователь. Я не понимаю, как и когда общий экземпляр NSHTTPCookieStorage теряет свои файлы cookie.

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

Во время бета-тестирования начались неприятности. Сбой, с которым я пришел, заключается в том, чтобы сохранить файлы cookie не только при завершении приложения, но и после вызовов API, которые передают мне эти куки. И загрузить сохраненные файлы cookie не только при запуске приложения, но и когда приложение вернется на передний план.

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

Заранее благодарю за ваши ответы

EDIT: Ниже приведены способы сохранения/чтения/очистки файлов cookie.

-(void)saveStoredCookies
{
    NSURL *httpUrl = @"http://myServer.com";
    NSURL *httpsUrl = @"https://myServer.com";

    NSArray *httpCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl];
    NSData *httpCookiesData = [NSKeyedArchiver archivedDataWithRootObject:httpCookies];
    [[NSUserDefaults standardUserDefaults] setObject:httpCookiesData forKey:@"savedHttpCookies"];

    NSArray *httpsCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpsUrl];
    NSData *httpsCookiesData = [NSKeyedArchiver archivedDataWithRootObject:httpsCookies];
    [[NSUserDefaults standardUserDefaults] setObject:httpsCookiesData forKey:@"savedHttpsCookies"];

    [[NSUserDefaults standardUserDefaults] synchronize];
}

-(void)readStoredCookies
{
    //clear, read and install stored cookies
    NSURL *httpUrl = @"http://myServer.com";
    NSURL *httpsUrl = @"https://myServer.com";

    NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl];
    for (NSHTTPCookie *cookie in cookies) {
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
    cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpsUrl];
    for (NSHTTPCookie *cookie in cookies) {
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }

    NSData *httpCookiesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"savedHttpCookies"];
    if([httpCookiesData length]) {
        NSArray *savedCookies = [NSKeyedUnarchiver unarchiveObjectWithData:httpCookiesData];
        for (NSHTTPCookie *cookie in savedCookies) {
            [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
        }       
    }
    NSData *httpsCookiesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"savedHttpsCookies"];
    if([httpsCookiesData length]) {
        NSArray *savedCookies = [NSKeyedUnarchiver unarchiveObjectWithData:httpsCookiesData];
        for (NSHTTPCookie *cookie in savedCookies) {
            [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
        }       
    }
}

-(void)clearStoredCookies
{
    NSURL *httpUrl = @"http://myServer.com";
    NSURL *httpsUrl = @"https://myServer.com";
    NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl];
    for (NSHTTPCookie *cookie in cookies) {
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
    cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpsUrl];
    for (NSHTTPCookie *cookie in cookies) {
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
}

Ответ 1

Решено!

После некоторой простой отладки я узнал, что проблема связана с URL-адресом, который я использовал в cookiesForURL:. Я просто начал использовать свойство cookies, и теперь он отлично работает.

Ответ 2

NSHttpCookieStorage теряет свои файлы cookie, потому что вы не установили срок действия файлов cookie. Установка времени истечения срока действия требуется, иначе ваши файлы cookie будут терять, когда ваше приложение выйдет.

Вот краткий обзор того, как я хранил файлы cookie во время выхода приложения и запуска,

NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:name forKey:NSHTTPCookieName];
[cookieProperties setObject:strValue forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"myserver.com" forKey:NSHTTPCookieDomain];    // Without http://
[cookieProperties setObject:@"myserver.com" forKey:NSHTTPCookieOriginURL]; // Without http://
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];

// set expiration to one month from now or any future NSDate of your choice
// this makes the cookie sessionless and it will persist across web sessions and app launches
/// if you want the cookie to be destroyed when your app exits, don't set this
[cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];

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

Надеюсь, что это поможет.

Ответ 3

humayun может быть прав -

Однако вы не должны писать файлы cookie в NSUserDefaults -

Весь смысл sharedHTTPCookieStorage - вы читаете их оттуда.

NSArray *httpCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl];

Вы не должны даже писать эти файлы cookie в NSUserDefaults по соображениям безопасности. Но, может быть, ты сможешь. В любом случае его вероятность того, что таймаут не был установлен как упомянутый гуманий.

В любом случае, пожалуйста, отредактируйте свой код и не пытайтесь хранить файлы cookie в пользовательских префайлах.

Ответ 4

Это симулятор? И используя скользящие куки?

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

Это не проблема на самом устройстве, где каждое приложение имеет свой собственный магазин cookie. (И, честно говоря, я еще не заметил, что это происходит в Mountain Lion.)