ver ocultas mis las historial facturacion estan donde descargas datos consultar compras como app aplicaciones ios nsuserdefaults keychain

ios - ocultas - ver app store en itunes



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

Al revisar este código de ejemplo, probé primero el envoltorio de Apple del código de ejemplo, pero esto es mucho más simple para mí.

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 NSUserDefaults 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 guardado de nombre de usuario / contraseña.

Entonces los NSUserDefaults serán borrados entonces.

Pero en mi aplicación necesito este nombre de usuario / contraseña para consultas de base de datos para el usuario. Entonces: ¿Dónde almacenar los datos, excepto NSUserDefaults ? (Este lugar puede / debe eliminarse cuando el usuario salga de la aplicación o cierre la sesión).


Decidí responder cómo usar el llavero en iOS 8 usando Obj-C y ARC.

1) Utilicé el keychainItemWrapper (versión ARCifief) de GIST: https://gist.github.com/dhoerl/1170641/download - Agregue (+ copia) el KeychainItemWrapper.h y .m a su proyecto

2) Agregue el marco de seguridad a su proyecto (controle 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 llavero:

NSString *emailAddress = self.txtEmail.text; NSString *password = self.txtPasword.text; //because keychain saves password as NSData object NSData *pwdData = [password dataUsingEncoding:NSUTF8StringEncoding]; //Save item self.keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil]; [self.keychainItem setObject:emailAddress forKey:(__bridge id)(kSecAttrAccount)]; [self.keychainItem setObject:pwdData forKey:(__bridge id)(kSecValueData)];

5) Lea los datos (probablemente en la pantalla de inicio de sesión al cargar> viewDidLoad):

self.keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil]; self.txtEmail.text = [self.keychainItem objectForKey:(__bridge id)(kSecAttrAccount)]; //because label uses NSString and password is NSData object, conversion necessary NSData *pwdData = [self.keychainItem objectForKey:(__bridge id)(kSecValueData)]; NSString *password = [[NSString alloc] initWithData:pwdData encoding:NSUTF8StringEncoding]; self.txtPassword.text = password;

¡Disfrutar!


Hay un pequeño error en el código anterior (por la forma en que Dave fue muy útil, gracias a tu publicación)

En la parte donde guardamos las credenciales, también necesita el siguiente código para funcionar correctamente.

[self.keychainItem setObject:@"myCredentials" forKey:(__bridge id)(kSecAttrService)];

lo más probable es que la segunda vez que intentemos (re) iniciar sesión con las mismas credenciales, las encuentre ya asignadas en los elementos del llavero y la aplicación se bloquee. Con el código anterior funciona como un encanto.


Lo siguiente debería funcionar bien:

KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil]; [keychainItem setObject:@"password you are saving" forKey:kSecValueData]; [keychainItem setObject:@"username you are saving" forKey:kSecAttrAccount];


Miré usando KeychainItemWrapper (la versión ARC) pero no encontré su envoltorio de Objective C tan sano como se desea.

Utilicé esta solución de Kishikawa Katsumi , lo que significaba que escribí menos código y no tuve que usar moldes para almacenar valores de NSString.

Dos ejemplos de almacenamiento:

[UICKeyChainStore setString:@"kishikawakatsumi" forKey:@"username"]; [UICKeyChainStore setString:@"P455_w0rd$1$G$Z$" forKey:@"password"];

Dos ejemplos de recuperación

UICKeyChainStore *store = [UICKeyChainStore keyChainStore]; // or UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"YOUR_SERVICE"]; NSString *username = [store stringForKey:@"username"]; NSString *password = [store stringForKey:@"password"];


Para actualizar esta pregunta:

Para aquellos que usan Swift Checkout, esta implementación de arrastrar y soltar Swift por Mihai Costea es compatible con los 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 un id de sesión de persistencia) y el correo electrónico o el nombre de la cuenta puede ser suficiente. 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, ¿no?).



Pero, ahora puede optar por NURLCredential en lugar de un contenedor de llavero. Hace lo que tenemos que hacer.



Si tiene un problema al recuperar la contraseña con el contenedor de llavero, use este código:

NSData *pass =[keychain objectForKey:(__bridge id)(kSecValueData)]; NSString *passworddecoded = [[NSString alloc] initWithData:pass encoding:NSUTF8StringEncoding];


Siempre debe usar Keychain para almacenar nombres de usuario y contraseñas, y como se almacena de forma segura y solo es accesible para su aplicación, no es necesario eliminarlo cuando se cierre la aplicación (si esa era su preocupación).

Apple proporciona un código de muestra que almacena, lee y elimina elementos de llavero y aquí es cómo usar la clase de envoltura de llavero de esa muestra que simplifica enormemente el uso de Llavero.

Incluya Security.framework (en Xcode 3 haga clic con el botón derecho en la carpeta de marcos y agregue el marco existente. En Xcode 4 seleccione su proyecto, luego seleccione destino, vaya a la pestaña Crear fases y haga clic en + bajo Vincular archivos binarios con archivos) y KeychainItemWrapper .h &. m archivos en su proyecto, # importe el archivo .h donde necesite usar llavero y luego cree una instancia de esta clase:

KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];

( YourAppLogin puede ser cualquier cosa que elija para llamar a su elemento de llavero y puede tener varios elementos si es necesario)

Luego puedes 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ígalos usando:

NSString *password = [keychainItem objectForKey:kSecValueData]; NSString *username = [keychainItem objectForKey:kSecAttrAccount];

O elimínelos usando:

[keychainItem resetKeychainItem];


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 answer detallada.


Una solución muy fácil a través de Keychains .

Es una envoltura simple para el sistema de llavero. Solo agregue los SSKeychain.h , SSKeychain.m , SSKeychainQuery.h y SSKeychainQuery.m a su proyecto y agregue Security.framework a su destino.

Para guardar una contraseña:

[SSKeychain setPassword:@"AnyPassword" forService:@"AnyService" account:@"AnyUser"]

Para recuperar una contraseña:

NSString *password = [SSKeychain passwordForService:@"AnyService" account:@"AnyUser"];

Donde setPassword es el valor que desea guardar y forService es la variable en la que desea guardarlo y cuenta para qué usuario / objeto está la contraseña y cualquier otra información.


prueba este

KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil]; [keychainItem setObject:@"password you are saving" forKey:kSecValueData]; [keychainItem setObject:@"username you are saving" forKey:kSecAttrAccount];

puede que ayude