ver puedo otro olvide mac llavero ingresa incorrectas despues desde contraseñas contraseña codigo aprobar apple iphone objective-c cocoa-touch keychain

otro - ¿Puedo acceder al llavero en el iPhone?



no puedo aprobar mi iphone (7)

Esta pregunta analiza el cifrado de datos en el iPhone utilizando la función crypt (). Como alternativa, ¿hay un llavero en el iPhone y, de ser así, qué código utilizaría para acceder a él con el fin de almacenar los datos de inicio de sesión y luego recuperarlos en una aplicación?




Esto es lo que uso para almacenar pares clave / valor en el llavero. Asegúrese de agregar Security.framework a su proyecto

#import <Security/Security.h> // ------------------------------------------------------------------------- -(NSString *)getSecureValueForKey:(NSString *)key { /* Return a value from the keychain */ // Retrieve a value from the keychain NSDictionary *result; NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, kSecReturnAttributes, nil] autorelease]; NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, kCFBooleanTrue, nil] autorelease]; NSDictionary *query = [[NSDictionary alloc] initWithObjects: objects forKeys: keys]; // Check if the value was found OSStatus status = SecItemCopyMatching((CFDictionaryRef) query, (CFTypeRef *) &result); [query release]; if (status != noErr) { // Value not found return nil; } else { // Value was found so return it NSString *value = (NSString *) [result objectForKey: (NSString *) kSecAttrGeneric]; return value; } } // ------------------------------------------------------------------------- -(bool)storeSecureValue:(NSString *)value forKey:(NSString *)key { /* Store a value in the keychain */ // Get the existing value for the key NSString *existingValue = [self getSecureValueForKey:key]; // Check if a value already exists for this key OSStatus status; if (existingValue) { // Value already exists, so update it NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, nil] autorelease]; NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, nil] autorelease]; NSDictionary *query = [[[NSDictionary alloc] initWithObjects: objects forKeys: keys] autorelease]; status = SecItemUpdate((CFDictionaryRef) query, (CFDictionaryRef) [NSDictionary dictionaryWithObject:value forKey: (NSString *) kSecAttrGeneric]); } else { // Value does not exist, so add it NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, kSecAttrGeneric, nil] autorelease]; NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, value, nil] autorelease]; NSDictionary *query = [[[NSDictionary alloc] initWithObjects: objects forKeys: keys] autorelease]; status = SecItemAdd((CFDictionaryRef) query, NULL); } // Check if the value was stored if (status != noErr) { // Value was not stored return false; } else { // Value was stored return true; } }

Vale la pena señalar que estas claves / valores no se eliminarán si el usuario elimina su aplicación. Si un usuario borra su aplicación y luego la reinstala, la clave / valores seguirán estando accesibles.


Hay un llavero que puede usar: para el código, la mejor opción es consultar la aplicación de muestra GenericKeychain de Apple:

Muestra de GenericKeychain



Otra cosa a tener en cuenta: las API de llavero no funcionan en el simulador cuando se usan versiones anteriores (2.x, 3.x) del iPhone SDK. ¡Esto podría ahorrarle mucha frustración cuando realice las pruebas!


También recuerde que al generar un AppID, si desea que más de una aplicación acceda a la misma información de Keychain, debe generar un WildID AppID (#####. Com.prefix. *) ...