2012-07-19 6 views
12

Sto sviluppando un'applicazione in cui il server mi fornisce un cookie per identificare l'utente.L'istanza condivisa di NSHTTPCookieStorage non mantiene i cookie

Le mie richieste successive devono avere quel cookie per avere la risposta che l'utente si aspetta. Quello che non riesco a capire è come e quando l'istanza condivisa di NSHTTPCookieStorage perde i suoi cookie.

La prima soluzione che ho usato è quella di archiviare e salvare i cookie dal mio server alle impostazioni predefinite dell'utente sulle terminazioni delle applicazioni, quindi cancellare quelle esistenti dal mio server all'avvio dell'applicazione e ripristinare quelle che ho memorizzato. Durante il processo di sviluppo non ho riscontrato problemi poiché le sessioni per il debug sono molto brevi e di solito non è necessario mettere l'app in background.

Durante il beta test, sono iniziati i problemi. L'hack con cui sono arrivato è quello di salvare i cookie non solo sulla terminazione dell'applicazione, ma anche dopo le chiamate API che mi restituiscono questi cookie. E per caricare i cookie salvati non solo all'avvio dell'app ma anche quando l'app torna in primo piano.

Come mai l'istanza di condivisione NSHTTPCookieStorage si sbarazza di questi cookie e qual è la migliore pratica per gestirli poiché è una parte vitale della mia app e non posso fidarmi di una tale soluzione compromessa se non supportata da sviluppatori più esperti .

Grazie in anticipo per le risposte

EDIT: Questi sono i metodi per salvare/lettura/cancellare i 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]; 
    } 
} 
+0

Si prega di aggiornare con il codice che si sta utilizzando per estrarre i cookies dall'archiviazione dei cookie su una nuova richiesta. la tua descrizione non è sufficiente –

+0

Non si è verificato alcun problema perché non si caricavano i cookie dallo spazio di archiviazione tra nuove sessioni durante il test. –

risposta

-1

Risolto!

Dopo un semplice debug ho scoperto che il problema era con l'url che stavo usando in cookiesForURL:. Ho semplicemente iniziato a utilizzare la proprietà cookies e ora funziona correttamente.

+0

si prega di aggiornare il codice, sono nella stessa situazione – Halid

+0

Scusa ma non ho più accesso al codice. È di 4 anni fa. – Moxy

+0

@Moxy ho bisogno di aiuto per questo – Siva

18

NSHttpCookieStorage perde il suo cookie, perché non è stato impostato il tempo di scadenza per i biscotti. È necessario impostare il tempo di scadenza altrimenti i tuoi cookie perderanno al termine della tua app.

Ecco un rapido sguardo come ho conservato i miei biscotti durante l'uscita app e il lancio,

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

Spero che questo aiuti.

+0

la data di scadenza è già impostata dal server – Moxy

+0

Ho assegnato la tua risposta alla taglia anche se non è una soluzione per me, ma mi permette di scoprire cose che ho perso nel mio codice (con l'URL che ho usato non ho memorizzato alcun cookie) . Sono in vacanza ora e con le mie lezioni di surf torno a casa troppo stanco per toccare il mio codice. Modificherò la mia domanda quando cambierò qualcosa. – Moxy

2

Humayun potrebbe essere giusto -

Tuttavia non dovrebbe scrivere i cookie per NSUserDefaults -

Il punto di tutta la sharedHTTPCookieStorage è di leggerle da lì.

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

Non si dovrebbe anche essere in grado di scrivere quei biscotti a NSUserDefaults per motivi di sicurezza. Ma forse puoi. In ogni caso è probabile che il timeout non fosse impostato come menzionato da humayun.

In entrambi i casi si prega di refactoring il codice e non provare a memorizzare i cookie in prefs utente.

+0

Ma il problema è che non persistono nel sharedHTTPCookieStorage. Ho controllato la data di scadenza consegnata dal server ed è ben impostata (non scade prima di molto tempo) – Moxy

2

È questo il simulatore? E usando i biscotti rotanti?

Nel simulatore, i cookie non persistono realmente come dovrebbero, perché sono condivisi con Safari desktop. Quando i biscotti si rovesciano, uno finisce per sovrascrivere l'altro.

Questo non è un problema sul dispositivo stesso, in cui ogni app ha il proprio archivio di cookie.(E, a dire il vero, non ho notato che sta succedendo ancora a Mountain Lion.)

+0

Sto usando un dispositivo reale – Moxy

+1

Grazie! Mi ha salvato dal diventare pazzo cercando di scoprire perché i cookie non persistevano sul simulatore. –