2014-04-30 18 views
5

Sto sviluppando un'applicazione iOS (utilizzando AFNetworking 2, AFURLSessionManager) in cui devo interagire con un'API che non controllo (che utilizza Symfony PHP quadro se ciò fa differenza).- Come implementare l'aggiornamento automatico dei cookie di sessione tramite AFNetworking 2

Il problema è questo: l'utente ha un account. Al primo avvio dell'applicazione, l'utente ottiene una schermata di accesso basata su moduli. Si collegano, quindi ricevono un cookie di sessione. Il cookie scade tra 30 minuti. Si rinnoverà su ogni chiamata effettuata dal cliente. TUTTAVIA, se l'app viene riavviata, il cookie viene eliminato e se l'app è inattiva per più di 30 minuti, il cookie non sarà più valido.

Ho più difficoltà qui. Prima di tutto, ho bisogno di effettuare la chiamata di accesso in modo trasparente, in modo che l'utente non debba effettuare nuovamente il login. Quindi ottengo la risposta all'errore e faccio la richiesta di accesso e, in caso di successo, rifaccio la richiesta originale. Il problema è che potrebbero verificarsi diverse richieste simultanee e associarle alla natura inaffidabile delle connessioni di rete mobile. Quindi, ciò che accade con questa logica sembra un incubo di accessi e tentativi multipli e un sacco di codice in più e gestione degli errori.

La mia soluzione finora è questa: Effettua una richiesta. Se ricevo una risposta di errore non autorizzata, aggiungi la richiesta a una coda tentativi (che gestisco personalmente), imposta un flag di accesso e inoltra la richiesta di accesso. Eventuali nuove richieste in arrivo controllano prima il flag di login, per vedere se c'è un login in corso. Se è così, vanno direttamente alla coda dei tentativi. Una volta completata la richiesta di accesso, passo alla coda dei tentativi e faccio tutte le richieste in coda.

Finora, sembra funzionare abbastanza bene. MA, ho questa sensazione fastidiosa che ci deve essere un modo migliore. Non ci sono meccanismi integrati per affrontare questo tipo di situazione? Sembra un modo comune per gestire l'autenticazione dell'utente, ma non riesco a trovare alcuna documentazione su come gestirlo in AFNetworking. Coprono l'autenticazione di base e Digest ma nulla su questa autenticazione cookie di sessione basata su modulo. Questa è la prima volta che devo affrontare questo problema e non riesco a credere che nessun altro abbia avuto lo stesso identico problema. Qualche idea?

+0

Stesso problema/domanda qui, mi piacerebbe per AFNetworking di avere una sorta di blocco "nuovo login" in il responsabile delle operazioni o qualcosa del genere. – StijnSpijker

+0

Questo potrebbe essere utile - http://stackoverflow.com/a/24778719/900024 –

+0

Verificherò questo aspetto Pratik questo sembra promettente – d370urn3ur

risposta

0

l'ID sessione deve essere inviato automaticamente una volta effettuato l'accesso, a condizione che il cookie non scada prima che venga inviata la richiesta successiva. NSURLConnection, che utilizza AFNetworking, si prende cura del questo è un modo per risparmiare e biscotti di carico provare come questo

- (void)saveCookies{ 

    NSData *savecookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject: savecookiesData forKey: @"sessionCookies"]; 
    [defaults synchronize]; 

} 

- (void)loadCookies{ 

    NSArray *loadcookiesarray = [NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey: @"sessionCookies"]]; 
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 

    for (NSHTTPCookie *cookies in loadcookiesarray){ 
     [cookieStorage setCookie: cookies]; 
    } 

} 
+0

hai risolto il problema – Sport

+0

Questo risolve il 50% del mio problema, persistendo i cookie attraverso i lanci di app. Tuttavia, la sessione scade dopo 30 minuti senza chiamate. Quindi, se l'utente controlla l'app, se ne va, torna in un'ora, devo autenticarmi nuovamente a prescindere da cosa. Questo succede abbastanza spesso. Quello che sto cercando, e quello che risolverebbe entrambi i problemi simultaneamente, è una sorta di callback che mi avvisa quando ottengo un 401 e sospendo la coda di richiesta fino a quando non ho completato un'azione di re-login. Pratik ha suggerito AFNetworking-AutoRetry e potrebbe essere la soluzione meno complicata. – d370urn3ur

Problemi correlati