Сохранение информации о сеансе путем обработки файлов cookie в iOS

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

NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request
                                                             completionHandler:^(NSData *data,
                                                                                 NSURLResponse *response,
                                                                                 NSError *error)
{ }];

Мой поток приложения: Если вы не вошли в систему -> Войти (вызов API входа в систему), иначе Перейдите на главный экран и вызовите другие API.

Моя проблема в том, что после удаления приложения из памяти информация о сеансе не сохраняется, и мне приходится снова вызывать Login. Мое требование похоже на Facebook, где пользователь должен войти в систему только один раз, и его сеанс сохраняется при следующих запусках приложения.

РЕДАКТИРОВАТЬ: я думаю, что мне нужно справиться с этим, получая и устанавливая файлы cookie для этих запросов. Я искал это, но не нашел подходящего образца. может ли кто-нибудь помочь мне с хорошим образцом по моей проблеме.

Спасибо!


person Azhar Bandri    schedule 08.07.2014    source источник
comment
Используйте NSUserDefaults или Key Chain.   -  person Toseef Khilji    schedule 08.07.2014
comment
@Virussmca Я думаю, они используются для хранения учетных данных, таких как имя пользователя и пароль. то, что я ожидаю, - это хранить и управлять полным информационным объектом сеанса.   -  person Azhar Bandri    schedule 08.07.2014
comment
@Virussmca извините! Я думаю, что задал неправильный вопрос относительно моей проблемы. Пожалуйста, ознакомьтесь с Edit для вышеуказанного вопроса.   -  person Azhar Bandri    schedule 08.07.2014


Ответы (1)


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

В моем вызове API входа в систему я делаю следующее:

NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request
                                                             completionHandler:^(NSData *data,
                                                                                 NSURLResponse *response,
                                                                                 NSError *error)
{
    NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;

    NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:[httpResp allHeaderFields] forURL:[response URL]];
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:cookies forURL:[response URL] mainDocumentURL:nil];
    for (NSHTTPCookie *cookie in cookies) {
        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:31536000] forKey:NSHTTPCookieExpires];

        NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
        NSLog(@"name:%@ value:%@", cookie.name, cookie.value);
    }
}];

Самая важная часть здесь — «dateByAddingTimeInterval:31536000». это устанавливает время истечения срока действия файла cookie в секундах. если это не установлено, сеанс поддерживается только для однократного использования.

Наконец, при выходе из системы я очищаю все файлы cookie.

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *each in cookieStorage.cookies) {
    [cookieStorage deleteCookie:each];
}
person Azhar Bandri    schedule 08.07.2014
comment
Когда вы отправляете последующие запросы, применяются ли эти файлы cookie к запросам автоматически? - person Isuru; 30.03.2017
comment
@Isuru Да, поскольку мы используем SharedSession во всех последующих запросах. - person Azhar Bandri; 30.03.2017
comment
Спасибо! Кстати, почему вы дважды сохраняете файлы cookie в NSHTTPCookieStorage в приведенном выше коде? Сначала файлы cookie непосредственно из полей заголовка, а затем измененные файлы cookie. Старые перезаписываются? - person Isuru; 30.03.2017