重置iPhone应用程序的钥匙串

我想知道是否有一种方法来重置我的应用程序的钥匙串。 我想知道是否有任何东西存在

[NSUserDefaults resetStandardUserDefaults]

为钥匙串。 即使应用程序被删除,钥匙链也不会被重置。 到目前为止,我知道的唯一方法是从应用程序中逐一重置它们。

由于所有的答案到目前为止依赖于你知道你想删除的标识符我想提交以下解决scheme, 删除应用程序的所有现有的键 (仅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); } 

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))") } 

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]; 

更简单:)

编辑:在回答下面的问题 – 什么是KeychainItemWrapper?

这是一个由苹果公司编写的类,你可以在这里下载: http : //developer.apple.com/library/ios/#samplecode/GenericKeychain/Listings/Classes_KeychainItemWrapper_m.html

将其添加到您的项目中,然后将其导入到您想要使用的位置。 然后使用上面提供的代码片段。

@ Vegard解决scheme的基于块的版本:

 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); 

对于我们这些喜欢直接丢弃代码的人而无需使用帮助器方法。

 - (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]; }