重置iPhone应用程序的钥匙串

Jos*_*ian 21 iphone cocoa-touch objective-c ios4 ios

我想知道是否有办法重置我的应用程序的钥匙串.我想知道是否有任何事情存在

[NSUserDefaults resetStandardUserDefaults]

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

Veg*_*ard 57

因为到目前为止所有的答案都依赖于您知道要删除的标识符我想提交以下解决方案来删除应用程序的所有现有密钥(仅限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);
}
Run Code Online (Sandbox Code Playgroud)

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))")
}
Run Code Online (Sandbox Code Playgroud)

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))")
}
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法使用手机本身手动删除所有钥匙串?像[这里]的说明(http://www.imore.com/how-access-and-view-your-icloud-keychain-passwords-ios-7) (4认同)
  • 以编程方式@abbood应该是不可能的.为什么?因为您的应用程序是沙盒,您永远无法从其他应用程序中删除所有钥匙串项****.唯一我猜*可能的情况是使用模拟器本身`iOS模拟器 - >重置内容和设置 (2认同)

jcr*_*son 11

KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"nameOfYourKeychain" accessGroup:nil];

[keychainItem resetKeychainItem];
Run Code Online (Sandbox Code Playgroud)

更简单:)

编辑:回答下面提出的问题 - KeychainItemWrapper是什么?

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

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

  • 嗨,KeychainItemWrapper是什么? (2认同)