2012-07-19 34 views
12

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]; 
    } 
} 
+0

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. –

+0

Nie widzisz problemu, ponieważ nie instalowałeś ciasteczek podczas przechowywania między nowymi sesjami. –

Odpowiedz

-1

Rozwiązany!

Po kilku prostych debugowaniach dowiedziałem się, że problem dotyczy adresu url, którego używałem w cookiesForURL:. Po prostu zacząłem używać właściwości cookies i teraz działa dobrze.

+0

proszę zaktualizować kod, jestem w tej samej sytuacji. – Halid

+0

Przepraszamy, ale nie mam już dostępu do kodu. To sprzed 4 lat. – Moxy

+0

@Moxy Potrzebuję pomocy w tym zakresie – Siva

18

NSHttpCookieStorage traci swoje ciasteczka, bo nie ustawić czas ważności na ciastka. Ustawienie czasu wygaśnięcia jest konieczne, inaczej pliki cookie zostaną utracone po wyjściu z aplikacji.

Oto krótkie spojrzenie w jaki sposób przechowywać moje ciasteczka podczas zjazdu i uruchomienie aplikacji,

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]; 

Nadzieja to pomaga.

+0

data wygaśnięcia jest już ustawiona przez serwer – Moxy

+0

Przyznałem twoją odpowiedź na nagrodę, chociaż nie jest to rozwiązanie dla mnie, ale pozwoliło mi odkryć rzeczy, które przeoczyłem w moim kodzie (z użyciem adresu URL nie zapisywałem żadnych plików cookie) . Jestem teraz na wakacjach iz lekcjami surfowania wracam do domu zbyt wyczerpany, by dotknąć mojego kodu. Będę edytować moje pytanie, kiedy coś zmienię. – Moxy

2

Humajun może mieć rację -

Jednak nie należy pisać cookies do NSUserDefaults -

Cały punkt sharedHTTPCookieStorage to czytasz je stamtąd.

Nie powinieneś nawet móc zapisywać tych plików cookie w NSUserDefaults ze względów bezpieczeństwa. Ale może możesz. Tak czy inaczej jest prawdopodobne, że timeout nie został ustawiony jako humayun.

Tak czy inaczej, proszę zinstaluj kod i nie próbuj przechowywać plików cookie w preferencjach użytkownika.

+0

Ale problem polega na tym, że nie występują one w udostępnionym plikuHTTPCookieStorage. Sprawdziłem datę wygaśnięcia przy przekazywaniu z serwera i jest dobrze skonfigurowany (nie wygasa przed długi czas) – Moxy

2

Czy to symulator? I za pomocą ruchomych ciasteczek?

W symulatorze pliki cookie nie zachowują się tak, jak powinny, ponieważ są one udostępniane komputerowi Safari. W miarę przewracania plików cookie jeden z nich zastępuje drugi.

To nie jest problem na samym urządzeniu, gdzie każda aplikacja ma swój własny magazyn plików cookie.(I, prawdę powiedziawszy, jeszcze nie zauważyłem, że to się dzieje w Mountain Lion.)

+0

Używam prawdziwego urządzenia – Moxy

+1

Dziękuję! Uratowałeś mnie od szaleństwa, próbując dowiedzieć się, dlaczego ciasteczka nie przetrwały na symulatorze. –

Powiązane problemy