¿Cómo almacenar información del usuario después de iniciar sesión correctamente en iOS?
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.