Colección de citas famosas - Slogan de motivación - ¿Cómo almacenar información del usuario después de iniciar sesión correctamente en iOS?

¿Cómo almacenar información del usuario después de iniciar sesión correctamente en iOS?

Keychain es una forma segura proporcionada por Apple de guardar nombres de usuario, contraseñas y certificados. Una vez que la información confidencial se guarda en el llavero, no se perderá cuando se desinstale la aplicación, a menos que el desarrollador elimine manualmente la información confidencial en la aplicación, siempre se guardará en el llavero.

Cuando utilices un llavero, primero debes introducir security.framework en el proyecto. Debido a que arc no es compatible, debemos habilitar el modo mrc para archivos relacionados en el entorno arc.

Primero, construimos una clase de herramienta a través de la cual podemos operar el llavero.

#Importar

#Importar

@Interface llavero: NSObject

//Guardar nombre de usuario y contraseña en el llavero

p >

+ (void)save:(NSString *)Service data:(id)data;

//Obtener el nombre de usuario y contraseña del llavero

+ (id ) load:(NSString *)Service;

//Eliminar nombre de usuario y contraseña del llavero

+ (void)delete:(NSString *)Service;

@end

En el archivo de implementación, escribimos esto:

#Import "KeyChain.h"

@implementation llavero

/ **

*Esta clase necesita funcionar en modo mrc. Siga los siguientes pasos para proyectos acr.

* Proyecto seleccionado -> Objetivo -> Objetivo correspondiente y luego seleccione "Fases de compilación" a la derecha, encontrará "Compilar código fuente" a continuación. Luego agregue el parámetro: -fno-objc-arc después del archivo correspondiente.

*

**/

+(NSMutableDictionary *)getkey chainquery:(ns string *)servicio {

return[NSMutableDictionary diccionarioConObjetosYClaves:

(id)kSecClassGenericPassword, (id)kSecClass,

Servicio, (id)kSecAttrService,

Servicio, (id)kSecAttrAccount,

(id)ksecattraccessiblafterfirsunlock, (id)kSecAttrAccessible,

nil];

}

#pragma etiqueta escribir

+ (void)guardar:(NSString *)Datos de servicio:(id)datos{

//Obtener diccionario de búsqueda

NSMutableDictionary * key chainquery =[self get key chainquery:service] ;

//Eliminar elementos antiguos antes de agregar elementos nuevos

secitem delete((CFDictionaryRef)key chain query);

//Agregar al diccionario de búsqueda Nuevo objeto (nota: formato de datos)

[objeto del conjunto de consultas del llavero:[nskeydarchiveddatawithrootobject:data]forKey:(id)kSecValueData];

//Utilice el diccionario de búsqueda para agregar elementos a llavero

SecItemAdd((CFDictionaryRef)consulta de cadena de claves, NULL);

}

# pragmark read

+ (id)cargar :(NSString *)servicio {

id ret = nil

NSMutableDictionary * key chainquery =[self get key chainquery:service];

/ /Configurar búsqueda settings

//Porque en nuestro ejemplo simple, solo queremos devolver un atributo (contraseña), por lo que podemos establecer el atributo kSecReturnData en kCFBooleanTrue

[objeto de conjunto de consulta de cadena de claves: (id)kcfbooleantureforkey:(id)kSecReturnData];

[objeto de conjunto de consulta de llavero:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];

CFDataRef keyData = NULL

if(secitemcopymapping((CFDictionaryRef)consulta de cadena de claves, (cf typeref *)&& keyData) == noErr) {

@try {

ret =[nskeydunarchiver unarchiveObjectWithData:(ns data *)key data];

} @ catch(n excepción * e){

NSLog(@"Unarchive"%@ "Error: %@", servicio,

e);

} @Finalmente{

}

}

if (datos clave)

cf lanzamiento(datos clave);

Devolver ret

}

# pragmark eliminar

+(void)eliminar:(ns cadena * )servicio {

NSMutableDictionary * key chainquery =[self get key chainquery:service];

secitem eliminar((CFDictionaryRef)key chain query);

}

@end

Las modificaciones al proyecto se han escrito claramente en los comentarios del código.

A continuación se explica cómo utilizar esta clase

Primero, definimos varios identificadores de tipo cadena.

ns string * const KEY_USERNAME_PASSWORD = @ " com . company . app . USERNAME PASSWORD ";

ns string * const KEY _ USERNAME = @ " com . company . app . USERNAME " ;

ns string * const KEY _ PASSWORD = @ " com . company . app . PASSWORD "

Después de eso, creamos un diccionario y ponemos el nombre de usuario y la contraseña. .

NSMutableDictionary * nombre de usuario contraseña kvpairs =[NSMutableDictionary diccionario];

[nombre de usuariocontraseñavpairs establecer objeto:@ "nombre de usuario" forKey:KEY _ nombre de usuario];

[nombre de usuariocontraseñavpairs set object:@ " PASSWORD " forKey:KEY _ PASSWORD];

Cada método de la clase de herramienta a la que se hace referencia a continuación agrega, lee y elimina el nombre de usuario y la contraseña respectivamente.

// A. Escribe el nombre de usuario y la contraseña en el llavero.

[Guardar llavero: KEY_USERNAME_PASSWORD datos: USERNAME contraseñakv pares];

// B. Leer el nombre de usuario y la contraseña del llavero.

NSMutableDictionary * leer USERNAME PASSWORD =(NSMutableDictionary *)[Carga de llavero:KEY_USERNAME_PASSWORD];

ns string * userName =[leer nombre de usuario contraseña objectForKey:KEY_userName ];

ns string * CONTRASEÑA =[leer nombre de usuario CONTRASEÑA objectForKey:KEY _ CONTRASEÑA];

NSLog(@ "nombre de usuario = %@ ", nombre de usuario);

NSLog(@"contraseña = %@ ", contraseña);

// C. Eliminar el nombre de usuario y la contraseña del llavero.

[Eliminar llavero:key_username_password];

Los llaveros tienen muchos usos.

Simplemente guardamos el nombre de usuario y la contraseña en el llavero en lugar de en la base de datos o nsuserdefaults para mayor seguridad.