Подтвердить что ты не робот

Как удалить все элементы keychain, доступные для приложения?

У меня есть блуждающие элементы keychain на iOS (возможно, написанные старой версией приложения), которые мне нужно удалить. Есть ли простой способ достичь этого?

4b9b3361

Ответ 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.