Я разрабатываю приложение, в котором сервер передает мне файл cookie для идентификации пользователя.
Мои последовательные запросы должны иметь этот файл cookie, чтобы получить ответ, который ожидает пользователь. Чего я не могу понять, так это того, как и когда общий экземпляр NSHTTPCookieStorage теряет свои файлы cookie.
Первое решение, которое я использовал, — это архивировать и сохранять куки-файлы с моего сервера в пользовательских значениях по умолчанию при завершении работы приложения, затем удалять существующие с моего сервера при запуске приложения и сбрасывать те, которые я сохранил. В процессе разработки я не сталкивался с проблемами, так как сеансы отладки очень короткие и обычно не нужно переводить приложение в фоновый режим.
Во время бета-тестирования начались проблемы. Хак, с которым я пришел, заключается в том, чтобы сохранять файлы cookie не только при завершении работы приложения, но и после вызовов API, которые возвращают мне эти файлы cookie. И загружать сохраненные куки не только при запуске приложения, но и когда приложение возвращается на передний план.
Почему экземпляр общего ресурса NSHTTPCookieStorage избавляется от этих файлов cookie и как лучше всего с этим справиться, поскольку это жизненно важная часть моего приложения, и я не могу доверять такому взломанному решению, если оно не поддерживается более опытными разработчиками.
Заранее спасибо за ответы
РЕДАКТИРОВАТЬ :Вот способы сохранения/чтения/очистки файлов 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];
}
}