Restablecer el llavero de una aplicación para iPhone

Me gustaría saber si hay una manera de restablecer el llavero de Mi aplicación. Me pregunto si existe algo como

[NSUserDefaults resetStandardUserDefaults]

para llavero La cadena de key no se restablece incluso después de eliminar la aplicación. Hasta ahora, la única manera que sé es restablecerlos uno por uno desde la aplicación.

Como todas las respuestas se basan en que usted conoce los identificadores que desea eliminar, me gustaría enviar la siguiente solución que elimina TODAS las keys existentes para la aplicación (solo iOS)

 -(void)resetKeychain { [self deleteAllKeysForSecClass:kSecClassGenericPassword]; [self deleteAllKeysForSecClass:kSecClassInternetPassword]; [self deleteAllKeysForSecClass:kSecClassCertificate]; [self deleteAllKeysForSecClass:kSecClassKey]; [self deleteAllKeysForSecClass:kSecClassIdentity]; } -(void)deleteAllKeysForSecClass:(CFTypeRef)secClass { NSMutableDictionary* dict = [NSMutableDictionary dictionary]; [dict setObject:(__bridge id)secClass forKey:(__bridge id)kSecClass]; OSStatus result = SecItemDelete((__bridge CFDictionaryRef) dict); NSAssert(result == noErr || result == errSecItemNotFound, @"Error deleting keychain data (%ld)", result); } 

Versión Swift 2.2 :

 func resetKeychain() { self.deleteAllKeysForSecClass(kSecClassGenericPassword) self.deleteAllKeysForSecClass(kSecClassInternetPassword) self.deleteAllKeysForSecClass(kSecClassCertificate) self.deleteAllKeysForSecClass(kSecClassKey) self.deleteAllKeysForSecClass(kSecClassIdentity) } func deleteAllKeysForSecClass(secClass: CFTypeRef) { let dict: [NSString : AnyObject] = [kSecClass : secClass] let result = SecItemDelete(dict) assert(result == noErr || result == errSecItemNotFound, "Error deleting keychain data (\(result))") } 

Versión Swift 3

 func resetKeychain() { deleteAllKeysForSecClass(kSecClassGenericPassword) deleteAllKeysForSecClass(kSecClassInternetPassword) deleteAllKeysForSecClass(kSecClassCertificate) deleteAllKeysForSecClass(kSecClassKey) deleteAllKeysForSecClass(kSecClassIdentity) } func deleteAllKeysForSecClass(_ secClass: CFTypeRef) { let dict: [NSString : Any] = [kSecClass : secClass] let result = SecItemDelete(dict as CFDictionary) assert(result == noErr || result == errSecItemNotFound, "Error deleting keychain data (\(result))") } 
 KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"nameOfYourKeychain" accessGroup:nil]; [keychainItem resetKeychainItem]; 

Mucho más simple 🙂

Editar: en respuesta a una pregunta que se hace a continuación: ¿qué es KeychainItemWrapper?

Es una class escrita por Apple que puede download aquí: http://developer.apple.com/library/ios/#samplecode/GenericKeychain/Listings/Classes_KeychainItemWrapper_m.html

Agréguelo a su proyecto y luego impórtelo donde quiera usarlo. Luego usa el fragment de código que proporcioné anteriormente.

Versión basada en bloques de la solución de @ Vegard:

 void (^deleteAllKeysForSecClass)(CFTypeRef) = ^(CFTypeRef secClass) { id dict = @{(__bridge id)kSecClass: (__bridge id)secClass}; OSStatus result = SecItemDelete((__bridge CFDictionaryRef) dict); NSAssert(result == noErr || result == errSecItemNotFound, @"Error deleting keychain data (%d)", (int)result); }; deleteAllKeysForSecClass(kSecClassGenericPassword); deleteAllKeysForSecClass(kSecClassInternetPassword); deleteAllKeysForSecClass(kSecClassCertificate); deleteAllKeysForSecClass(kSecClassKey); deleteAllKeysForSecClass(kSecClassIdentity); 

Para aquellos de nosotros que les gusta simplemente dejar el código sin tener que tener methods de ayuda.

 - (void)resetKeychainItem { OSStatus junk = noErr; if (!keychainItemData) { self.keychainItemData = [[NSMutableDictionary alloc] init]; } else if (keychainItemData){ NSMutableDictionary *tempDictionary = [self dictionaryToSecItemFormat:keychainItemData]; junk = SecItemDelete((CFDictionaryRef)tempDictionary); if ( junk != noErr ) { UIAlertView *dialog = [[UIAlertView alloc] initWithTitle:@"Keychain Error" message:[NSString stringWithFormat:@"A problem with updating the secure Keychain items with this information (likely, this email address information is duplicated in another Player). Error code: %d %@", junk, [self resultText:-junk]] delegate:self cancelButtonTitle:NSLocalizedStringFromTable(@"Ok", @"Localizable", @"display text") otherButtonTitles:nil]; [dialog show]; [dialog release]; //NSAssert( junk == noErr || junk == errSecItemNotFound, @"Problem deleting current dictionary." ); return; } } // Default attributes for keychain item. [keychainItemData setObject:@"" forKey:(id)kSecAttrAccount]; [keychainItemData setObject:@"" forKey:(id)kSecValueData]; [keychainItemData setObject:@"" forKey:(id)kSecAttrLabel]; [keychainItemData setObject:@"" forKey:(id)kSecAttrDescription]; [keychainItemData setObject:@"" forKey:(id)kSecAttrComment]; // Default data for keychain item. [keychainItemData setObject:@"" forKey:(id)kSecAttrModificationDate]; [keychainItemData setObject:@"" forKey:(id)kSecAttrService]; }