如何删除应用程序可访问的所有钥匙串项?

时间:2012-12-29 21:27:24

标签: objective-c ios

我在iOS上有杂项钥匙串项目(可能由旧版app编写),我需要删除。有没有一种简单的方法来实现这一目标?

7 个答案:

答案 0 :(得分:68)

为所有班级做

NSArray *secItemClasses = @[(__bridge id)kSecClassGenericPassword,
                       (__bridge id)kSecClassInternetPassword,
                       (__bridge id)kSecClassCertificate,
                       (__bridge id)kSecClassKey,
                       (__bridge id)kSecClassIdentity];
for (id secItemClass in secItemClasses) {
    NSDictionary *spec = @{(__bridge id)kSecClass: secItemClass};
    SecItemDelete((__bridge CFDictionaryRef)spec);
}

对于Swift:

    let secItemClasses =  [kSecClassGenericPassword, kSecClassInternetPassword, kSecClassCertificate, kSecClassKey, kSecClassIdentity]
    for itemClass in secItemClasses {
        let spec: NSDictionary = [kSecClass: itemClass]
        SecItemDelete(spec)
    }

答案 1 :(得分:13)

如何删除应用程序可访问的所有钥匙串项

的<{3}}的Xamarin iOS版本(MonoTouch)如下所示:

foreach (var recordKind in new []{
                SecKind.GenericPassword,
                SecKind.Certificate,
                SecKind.Identity,
                SecKind.InternetPassword,
                SecKind.Key,
            })
    {
          SecRecord query = new SecRecord(recordKind);
          SecKeyChain.Remove(query);
    }

如果您想确保删除记录,可以在开发期间使用此代码检查特定类型的KeyChain中的项目数:

SecStatusCode scc;
var records = SecKeyChain.QueryAsRecord(new SecRecord(SecKind.GenericPassword), 1000, out scc);

答案 2 :(得分:13)

我在Swift中重写了Daij-Djan的答案:

let secItemClasses = [kSecClassGenericPassword,
    kSecClassInternetPassword,
    kSecClassCertificate,
    kSecClassKey,
    kSecClassIdentity]
for secItemClass in secItemClasses {
    let dictionary = [kSecClass as String:secItemClass]
    SecItemDelete(dictionary as CFDictionary)
}

答案 3 :(得分:7)

感谢Daij-Djan我得到了这个解决方案:

for (id secclass in @[
     (__bridge id)kSecClassGenericPassword,
     (__bridge id)kSecClassInternetPassword,
     (__bridge id)kSecClassCertificate,
     (__bridge id)kSecClassKey,
     (__bridge id)kSecClassIdentity]) {
    NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                  secclass, (__bridge id)kSecClass,
                                  nil];

    SecItemDelete((__bridge CFDictionaryRef)query);        
}

答案 4 :(得分:6)

快速版本

import Foundation
import Security


public class Keychain: NSObject {
    public class func logout()  {
      let secItemClasses =  [kSecClassGenericPassword, kSecClassInternetPassword, kSecClassCertificate, kSecClassKey, kSecClassIdentity]
      for itemClass in secItemClasses {
        let spec: NSDictionary = [kSecClass: itemClass]
        SecItemDelete(spec)
      }
   }
}

用法:

Keychain.logout()

答案 5 :(得分:0)

您可以查看Utilities文件夹中的KeyChain Access应用程序。如果启动应用程序并单击“所有项目”,则应显示使用此特定计算机创建的所有项目。开发人员通常以com开头。

答案 6 :(得分:0)

不幸的是,此问题的所有答案似乎都已过时(自 iOS 7.0+ 起),因为它们不会删除设置了 kSecAttrSynchronizable 标志的钥匙串条目(允许通过 iCloud 同步到其他设备)。

要删除此类条目,需要在删除查询中添加一个条目,指定 kSecAttrSynchronizable: kSecAttrSynchronizableAny

let secItemClasses = [kSecClassGenericPassword,
    kSecClassInternetPassword,
    kSecClassCertificate,
    kSecClassKey,
    kSecClassIdentity]
for secItemClass in secItemClasses {
    let query: NSDictionary = [
        kSecClass as String: secItemClass,
        kSecAttrSynchronizable as String: kSecAttrSynchronizableAny
    ]
    SecItemDelete(query)
}