Non è necessario preoccuparsi di NSUserDefaults né di alcun wrapper portachiavi se si utilizza NSURLCredential
. Infatti è molto più semplice da usare, in quanto consente di memorizzare sia nome utente che password nel portachiavi in due righe di codice.
Il tuo codice sarebbe qualcosa di simile che una volta che l'utente è connesso:
NSURLCredential *credential;
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];
Poi, ogni volta che viene lanciata l'applicazione, è possibile verificare se l'utente è già stato effettuato l'accesso per la ricerca di qualsiasi credenziale in per accedere automaticamente indietro il vostro utente (se necessario):
NSURLCredential *credential;
NSDictionary *credentials;
credentials = [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:self.loginProtectionSpace];
credential = [credentials.objectEnumerator nextObject];
NSLog(@"User %@ already connected with password %@", credential.user, credential.password);
È inoltre necessario pulire le credenziali quando l'utente vuole disconnettersi:
NSURLCredential *credential;
NSDictionary *credentials;
credentials = [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:self.loginProtectionSpace];
credential = [credentials.objectEnumerator nextObject];
[[NSURLCredentialStorage sharedCredentialStorage] removeCredential:credential forProtectionSpace:self.loginProtectionSpace];
loginProtectionSpace
viene creato una volta per tutte. Si noti che questo codice di esempio presuppone che ci sia solo una credenziale in questo spazio, che di solito è il caso, a meno che non si gestiscano più account.
Ecco un esempio di come si dovrebbe creare un NSURLProtectionSpace
:
NSURL *url = [NSURL URLWithString:@"http://www.example.com"];
self.loginProtectionSpace = [[NSURLProtectionSpace alloc] initWithHost:url.host
port:[url.port integerValue]
protocol:url.scheme
realm:nil
authenticationMethod:NSURLAuthenticationMethodHTTPDigest];
Grazie per la risposta, sì, questo è quello che faccio per mantenere le vecchie credenziali. Quello che vorrei evitare è il POST iniziale per l'accesso ad ogni riavvio dell'app, mi chiedevo solo se la durata del cookie gestito da AFNetworking può essere estesa. –
In realtà, per favore non memorizzare nomi utente e password in NSUserDefaults. Usa invece il portachiavi. Apple distribuisce un KeychainWrapper che fa sostanzialmente la stessa cosa, ma in modo più sicuro. – eddieroger