iOS: ¿Cómo almacenar nombre de usuario/contraseña dentro de una aplicación?
Tengo una pantalla de inicio de sesión en mi aplicación iOS. El nombre de usuario y la contraseña se guardarán en NSUserDefaults
y se cargarán nuevamente en la pantalla de inicio de sesión cuando ingrese nuevamente a la aplicación (por supuesto, NSUserDefaults
son permanentes).
Ahora, el usuario tiene la posibilidad de desactivar la función de guardar nombre de usuario/contraseña.
Entonces el asunto NSUserDefaults
será aclarado.
Pero en mi aplicación necesito este nombre de usuario/contraseña para consultas de bases de datos para el usuario. Entonces: ¿Dónde almacenar los datos excepto NSUserDefaults
? (Este lugar puede/debe eliminarse cuando el usuario sale de la aplicación o cierra sesión).
Siempre debes usar Keychain para almacenar nombres de usuario y contraseñas, y dado que se almacena de forma segura y solo tu aplicación puede acceder a él, no es necesario eliminarlo cuando la aplicación se cierra (si esa fuera tu preocupación).
Apple proporciona un código de muestra que almacena, lee y elimina elementos de llavero y aquí se explica cómo usar la clase contenedora de llavero de ese ejemplo, lo que simplifica enormemente el uso de Llavero.
Incluya Security.framework (en Xcode 3, haga clic derecho en la carpeta de marcos y agregue el marco existente. En Xcode 4, seleccione su proyecto, luego seleccione el destino, vaya a la pestaña Fases de compilación y haga clic en + en Vincular binario con archivos) y KeychainItemWrapper .h & . m en su proyecto, #importe el archivo .h donde necesite usar el llavero y luego cree una instancia de esta clase:
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];
( YourAppLogin puede ser cualquier nombre que usted elija para llamar a su elemento de Llavero y puede tener varios elementos si es necesario)
Luego puede configurar el nombre de usuario y la contraseña usando:
[keychainItem setObject:@"password you are saving" forKey:kSecValueData];
[keychainItem setObject:@"username you are saving" forKey:kSecAttrAccount];
Consíguelos usando:
NSString *password = [keychainItem objectForKey:kSecValueData];
NSString *username = [keychainItem objectForKey:kSecAttrAccount];
O elimínelos usando:
[keychainItem resetKeychainItem];
Si necesita una versión ARC del contenedor, aquí está el enlace https://gist.github.com/1170641 Gracias a
Una solución muy fácil a través de Llaveros .
Es un contenedor simple para el sistema Keychain. Simplemente agregue los archivos , y SSKeychain.h
a SSKeychain.m
su proyecto y agregue Security.framework a su objetivo.SSKeychainQuery.h
SSKeychainQuery.m
Para guardar una contraseña:
[SSKeychain setPassword:@"AnyPassword" forService:@"AnyService" account:@"AnyUser"]
Para recuperar una contraseña:
NSString *password = [SSKeychain passwordForService:@"AnyService" account:@"AnyUser"];
¿ Dónde setPassword
está el valor que desea guardar y forService
la variable bajo la cual desea guardarlo y la cuenta para qué usuario/objeto es la contraseña y cualquier otra información?
Simplemente puede usar NSURLCredential
, guardará tanto el nombre de usuario como la contraseña en el llavero en solo dos líneas de código .
Vea mi respuesta detallada .
Si tiene problemas para recuperar la contraseña usando el contenedor de llavero, use este código:
NSData *pass =[keychain objectForKey:(__bridge id)(kSecValueData)];
NSString *passworddecoded = [[NSString alloc] initWithData:pass
encoding:NSUTF8StringEncoding];