Zajmuję się tworzeniem aplikacji, w której serwer podaje mi plik cookie w celu identyfikacji użytkownika.Udostępnione wystąpienie NSHTTPCookieStorage nie utrzymuje plików cookie
Moje kolejne żądania muszą zawierać plik cookie, aby uzyskać odpowiedź oczekiwaną przez użytkownika. Nie mogę zrozumieć, jak i kiedy udostępniona instancja NSHTTPCookieStorage traci pliki cookie.
Pierwsze używane przeze mnie rozwiązanie polega na archiwizowaniu i zapisywaniu plików cookie z mojego serwera do domyślnych ustawień użytkownika na zakończeniach aplikacji, a następnie usuwaniu istniejących z mojego serwera podczas uruchamiania aplikacji i resetowaniu tych, które zapisałem. Przez cały proces tworzenia nie napotkałem problemów, ponieważ sesje do debugowania są bardzo krótkie i zazwyczaj nie trzeba umieszczać aplikacji w tle.
Podczas testów beta wystąpiły problemy. Hack, z którym się zetknąłem, to zapisanie ciasteczek nie tylko po zakończeniu aplikacji, ale także po wywołaniu API, które przekazuje mi te pliki cookie. Aby załadować zapisane pliki cookie, nie tylko po uruchomieniu aplikacji, ale także po jej ponownym uruchomieniu.
W jaki sposób instancja NSHTTPCookieStorage pozbywa się tych plików cookie i jaka jest najlepsza metoda radzenia sobie z nimi, ponieważ jest to istotna część mojej aplikacji i nie mogę ufać takiemu zhakowanemu rozwiązaniu, jeśli nie jest ono wspierane przez bardziej doświadczonych programistów .
Z góry dziękuję za odpowiedzi
EDIT: Oto sposoby zapisu/odczytu/wyczyścić ciasteczka
-(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];
}
}
Zaktualizuj za pomocą kodu, którego używasz do wyciągnięcia plików cookie z przechowywania plików cookie po otrzymaniu nowego żądania. Twój opis jest niewystarczający. –
Nie widzisz problemu, ponieważ nie instalowałeś ciasteczek podczas przechowywania między nowymi sesjami. –