No necesita molestarse con NSUserDefaults ni ningún envoltorio de llavero si usa NSURLCredential
. De hecho NSURLCredential
es mucho más simple de usar, ya que le permite almacenar nombre de usuario y contraseña en el llavero en dos líneas de código.
Su código sería algo así como que una vez que el usuario se registra en:
NSURLCredential *credential;
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];
Entonces, cada vez que se inicia la aplicación, se puede comprobar si el usuario ya se ha iniciado sesión mediante la búsqueda de cualquier credencial para conectarse automáticamente a su usuario (si es necesario):
NSURLCredential *credential;
NSDictionary *credentials;
credentials = [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:self.loginProtectionSpace];
credential = [credentials.objectEnumerator nextObject];
NSLog(@"User %@ already connected with password %@", credential.user, credential.password);
también es necesario limpiar la credencial cuando el usuario desea cerrar la sesión:
NSURLCredential *credential;
NSDictionary *credentials;
credentials = [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:self.loginProtectionSpace];
credential = [credentials.objectEnumerator nextObject];
[[NSURLCredentialStorage sharedCredentialStorage] removeCredential:credential forProtectionSpace:self.loginProtectionSpace];
loginProtectionSpace
se crea de una vez por todas. Tenga en cuenta que este código de ejemplo supone que solo hay una credencial en este espacio, que generalmente es el caso a menos que administre varias cuentas.
Aquí es un ejemplo de cómo se crearía 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];
gracias por responder, sí, esto es lo que hago para mantener las credenciales de edad. Lo que me gustaría evitar es el POST inicial para iniciar sesión en cada reinicio de la aplicación, me preguntaba si la vida útil de la cookie manejada por AFNetworking puede extenderse. –
En realidad, no almacene nombres de usuario y contraseñas en NSUserDefaults. Use el llavero en su lugar. Apple distribuye un KeychainWrapper que básicamente hace lo mismo, pero de forma más segura. – eddieroger