pods mac instalar how afnetworking

afnetworking - mac - Redes y cookies



pod install xcode (2)

Estoy usando AFNetworking como una capa de red para mi aplicación de iPhone que se conecta a un servidor Rails que usa Devise para la autenticación. Si inicio sesión (con una llamada POST) que proporcione un nombre de usuario / contraseña, después de eso, cualquier GET que realice estará bien.

Si cierro la aplicación (no solo el fondo), todas mis solicitudes GET fallan porque creo que no están autenticadas.

Así que supongo que las cookies están almacenadas en algún lugar; ¿Hay alguna forma de guardarlos en NSUserDefaults o en algún lugar así para evitar el inicio de sesión en todo momento?


Las cookies se almacenan automáticamente durante la vida útil de su aplicación para cualquier solicitud posterior en un servidor en particular. Una buena estrategia sería almacenar el nombre de usuario y la contraseña en el llavero o en NSUserDefaults como este:

// Setting [[NSUserDefaults standardDefaults] setObject:username forKey:@"username"]; [[NSUserDefaults standardDefaults] synchronize]; // Getting NSString *username = [[NSUserDefaults standardDefaults] objectForKey:@"username"];

Es posible que desee utilizar esto en combinación con AFHTTPClient para enviar sus credenciales junto con cada solicitud en un encabezado HTTP de Authorization .


No es necesario molestarse con NSUserDefaults ni con ningún envoltorio de llavero si utiliza NSURLCredential . De hecho, NSURLCredential es mucho más fácil de usar , ya que le permite almacenar tanto el nombre de usuario como la contraseña en el llavero en dos líneas de código.

Tu código sería algo así una vez que el usuario haya iniciado sesión:

NSURLCredential *credential; credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent]; [[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];

Luego, cada vez que se inicie la aplicación, puede verificar si su usuario ya inició sesión buscando alguna credencial para registrar 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 debe limpiar la credencial cuando el usuario desea cerrar 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 asume que solo hay una credencial en este espacio, lo que suele ser el caso a menos que administre varias cuentas.

Este es un ejemplo de cómo 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];