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 el NSUserDefaults
y se cargarán nuevamente en la pantalla de inicio de sesión cuando vuelva a ingresar a la aplicación (por supuesto, NSUserDefaults
son permanentes).
Ahora, el usuario tiene la posibilidad de desactivar la función de guardado de nombre de usuario / contraseña.
Entonces el NSUserDefaults
será borrado entonces.
Pero en mi aplicación necesito este nombre de usuario / contraseña para consultas de la base de datos para el usuario. Entonces: ¿Dónde almacenar los datos excepto NSUserDefaults
? (Este lugar puede / debe eliminarse cuando el usuario cierra la aplicación o cierra sesión).
ios
nsuserdefaults
keychain
Kovu
fuente
fuente
Respuestas:
Siempre debe usar Keychain para almacenar nombres de usuario y contraseñas, y dado que se almacena de forma segura y solo es accesible para su aplicación, no hay necesidad de eliminarlo cuando la aplicación se cierra (si esa era su 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 de contenedor de llavero de esa muestra, lo que simplifica enormemente el uso de Keychain.
Incluya Security.framework (en Xcode 3, haga clic con el botón derecho en la carpeta de frameworks y agregue el framework existente. En Xcode 4 seleccione su proyecto, luego seleccione el objetivo, vaya a la pestaña Build Fases y haga clic en + debajo de Link Binary With Files) y KeychainItemWrapper .h &. m archivos en su proyecto, # importe el archivo .h donde necesite usar llavero y luego cree una instancia de esta clase:
( YourAppLogin puede ser cualquier cosa que 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:
Consíguelos usando:
O elimínelos usando:
fuente
kSecValueData
ykSecAttrAccount
en el código Objective-C, así que asegúrese de enviarlas usando(__bridge id)
, por ejemplo,[keychainItem setObject:obj forKey:(__bridge id)kSecValueData];
Si necesita una versión ARC del contenedor aquí está el enlace https://gist.github.com/1170641 Gracias a
fuente
Una solución muy fácil a través de llaveros .
Es un contenedor simple para el sistema Keychain. Sólo tiene que añadir los
SSKeychain.h
,SSKeychain.m
,SSKeychainQuery.h
ySSKeychainQuery.m
los archivos a su proyecto y añadir el Security.framework a su objetivo.Para guardar una contraseña:
Para recuperar una contraseña:
¿Dónde
setPassword
está el valor que desea guardar y enforService
qué variable desea guardarlo? La cuenta es para qué usuario / objeto se utiliza la contraseña y cualquier otra información.fuente
NSString *username = [[SSKeychain accountsForService:@"AnyService"][0] valueForKey:@"acct"]
. Esto debería funcionar bien si solo usa una cuenta. Como siempre, asegúrese de verificar la longitud de la matriz antes de intentar acceder al índice 0.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 .Ver mi respuesta detallada .
fuente
Decidí responder cómo usar el llavero en iOS 8 usando Obj-C y ARC.
1) Utilicé keychainItemWrapper (versión ARCifief) de GIST: https://gist.github.com/dhoerl/1170641/download - Agregue (+ copie) KeychainItemWrapper.h y .m a su proyecto
2) Agregue el marco de seguridad a su proyecto (verifique proyecto> Fases de compilación> Enlace binario con bibliotecas)
3) Agregue la biblioteca de seguridad (#import) y KeychainItemWrapper (#import "KeychainItemWrapper.h") al archivo .h y .m donde desea usar keychain.
4) Para guardar datos en el llavero:
5) Leer datos (probablemente pantalla de inicio de sesión al cargar> viewDidLoad):
¡Disfrutar!
fuente
Si tiene problemas para recuperar la contraseña con el contenedor de llavero, use este código:
fuente
compruebe este código de muestra que probé primero el contenedor de la manzana del código de muestra, pero esto es mucho más simple para mí
fuente
prueba este:
Que te ayude.
fuente
Observé el uso de KeychainItemWrapper (la versión ARC) pero no encontré su envoltorio de Objective C tan saludable como lo deseé.
Utilicé esta solución de Kishikawa Katsumi , lo que significaba que escribí menos código y no tuve que usar moldes para almacenar valores NSString.
Dos ejemplos de almacenamiento:
Dos ejemplos de recuperación
fuente
Hay un pequeño error en el código anterior (por cierto Dave, fue muy útil tu publicación, gracias)
En la parte donde guardamos las credenciales, también necesita el siguiente código para que funcione correctamente.
Lo más probable es que la segunda vez que intentamos (re) iniciar sesión con las mismas credenciales las encuentra ya asignadas en los elementos del llavero y la aplicación falla. con el código anterior funciona de maravilla.
fuente
Para actualizar esta pregunta:
Para aquellos que usan el pago rápido, esta implementación rápida de arrastrar y soltar por Mihai Costea apoyando grupos de acceso:
https://github.com/macostea/KeychainItemWrapper.swift/blob/master/KeychainItemWrapper.swift
Antes de usar el llavero: considere dos veces antes de almacenar las contraseñas. En muchos casos, almacenar un token de autenticación (como una identificación de sesión de persistencia) y el correo electrónico o el nombre de la cuenta pueden ser suficientes. Puede invalidar fácilmente los tokens de autenticación para bloquear el acceso no autorizado, lo que requiere que el usuario inicie sesión nuevamente en el dispositivo comprometido, pero no requiere restablecer la contraseña y tener que iniciar sesión nuevamente en todos los dispositivos (no solo estamos usando Apple, ¿verdad?).
fuente
Pero, ahora puede optar por NURLCredential en lugar de envoltorio de llavero. Hace lo que necesitamos hacer.
fuente
Para swift puedes usar esta biblioteca:
https://github.com/jrendel/SwiftKeychainWrapper
Es compatible con todas las versiones de swift.
fuente
Lo siguiente debería funcionar bien:
fuente