我在iOS上有杂项钥匙串项目(可能由旧版app编写),我需要删除。有没有一种简单的方法来实现这一目标?
答案 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)
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)
}