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];
}
}
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 –
Non si è verificato alcun problema perché non si caricavano i cookie dallo spazio di archiviazione tra nuove sessioni durante il test. –