Как удалить все элементы keychain, доступные для приложения?
У меня есть блуждающие элементы keychain на iOS (возможно, написанные старой версией приложения), которые мне нужно удалить. Есть ли простой способ достичь этого?
Ответы
Ответ 1
сделать это для всех классов
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);
}
Для Свифта:
let secItemClasses = [kSecClassGenericPassword, kSecClassInternetPassword, kSecClassCertificate, kSecClassKey, kSecClassIdentity]
for itemClass in secItemClasses {
let spec: NSDictionary = [kSecClass: itemClass]
SecItemDelete(spec)
}
Ответ 2
Версия Xamarin iOS (MonoTouch) принятого ответа о том, как удалить все элементы keychain, доступные для приложения, находится ниже:
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);
Ответ 3
Я переписал Daij-Djan ответ в Swift:
let secItemClasses = [kSecClassGenericPassword,
kSecClassInternetPassword,
kSecClassCertificate,
kSecClassKey,
kSecClassIdentity]
for secItemClass in secItemClasses {
let dictionary = [kSecClass as String:secItemClass]
SecItemDelete(dictionary as CFDictionary)
}
Ответ 4
Благодаря 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);
}
Ответ 5
Swift версия
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()
Ответ 6
Вы можете посмотреть приложение KeyChain Access, находящееся в папке "Утилиты". Если вы запустите приложение и нажмите "Все элементы", он должен отобразить все элементы, созданные вами на этом конкретном компьютере. Разработчики обычно начинаются с com.