У меня есть блуждающие элементы keychain на iOS (возможно, написанные старой версией приложения), которые мне нужно удалить. Есть ли простой способ достичь этого?
Как удалить все элементы keychain, доступные для приложения?
Ответ 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.