iOS: ¿Cómo almacenar nombre de usuario/contraseña dentro de una aplicación?

Resuelto PassionateDeveloper asked hace 54 años • 15 respuestas

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 NSUserDefaultsy se cargarán nuevamente en la pantalla de inicio de sesión cuando ingrese nuevamente a la aplicación (por supuesto, NSUserDefaultsson permanentes).

Ahora, el usuario tiene la posibilidad de desactivar la función de guardar nombre de usuario/contraseña.

Entonces el asunto NSUserDefaultsserá 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).

PassionateDeveloper avatar Jan 01 '70 08:01 PassionateDeveloper
Aceptado

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];
Filip Radelic avatar Aug 07 '2011 10:08 Filip Radelic

Si necesita una versión ARC del contenedor, aquí está el enlace https://gist.github.com/1170641 Gracias a

Manuel Pintaldi avatar Mar 24 '2012 11:03 Manuel Pintaldi

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.ha SSKeychain.msu proyecto y agregue Security.framework a su objetivo.SSKeychainQuery.hSSKeychainQuery.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 setPasswordestá el valor que desea guardar y forServicela variable bajo la cual desea guardarlo y la cuenta para qué usuario/objeto es la contraseña y cualquier otra información?

sust86 avatar Nov 30 '2012 08:11 sust86

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 .

Phil avatar Aug 02 '2013 05:08 Phil

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];
Robby891 avatar Feb 27 '2014 21:02 Robby891