Перечислите все элементы цепочки для ключей в моем приложении iOS

Какой самый простой способ программно (из моего приложения) получить все элементы, хранящиеся в цепочке для ключей?

Вероятно, это как-то связано с SecItemCopyMatching (), но документация для этой функции не очень понятна (и мне не удалось найти достойный образец в Интернете).

Ответы на вопрос(4)

open func getAllKeyChainItemsOfClass(_ secClass: String) -> [String:String] {

        let query: [String: Any] = [
            kSecClass : secClass,
            kSecReturnData  : kCFBooleanTrue,
            kSecReturnAttributes : kCFBooleanTrue,
            kSecReturnRef : kCFBooleanTrue,
            kSecMatchLimit : kSecMatchLimitAll
        ]

        var result: AnyObject?

        let lastResultCode = withUnsafeMutablePointer(to: &result) {
            SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
        }

        var values = [String:String]()
        if lastResultCode == noErr {
            let array = result as? Array<Dictionary<String, Any>>

            for item in array! {
                if let key = item[kSecAttrAccount] as? String, 
                   let value = item[kSecValueData] as? Data {
                   values[key] = String(data: value, encoding:.utf8) 
                }
            }
        }

        return values
    }
 15 дек. 2017 г., 22:35
Изменение строк, которые устанавливают ключ и значение, делает сбой невозможным, хотя он устраняет несколько объектов, которые я не знаю, как вытащить:if let key = item[kSecAttrAccount] as? String, let value = item[kSecValueData] as? Data {
 15 дек. 2017 г., 21:59
Используя Swift 3 на Xcode 9.2, это дает сбой приlet key : String = item[kSecAttrAccount] as! String сCould not cast value of type '__NSCFData' (0x109b30348) to 'NSString' (0x1069030d0)., Я не уверен почему.

func getAllKeyChainItemsOfClass(_ secClass: String) -> [String:String] {

    let query: [String: Any] = [
        kSecClass as String : secClass,
        kSecReturnData as String  : kCFBooleanTrue,
        kSecReturnAttributes as String : kCFBooleanTrue,
        kSecReturnRef as String : kCFBooleanTrue,
        kSecMatchLimit as String : kSecMatchLimitAll
    ]

    var result: AnyObject?

    let lastResultCode = withUnsafeMutablePointer(to: &result) {
        SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
    }

    var values = [String:String]()
    if lastResultCode == noErr {
        let array = result as? Array<Dictionary<String, Any>>

        for item in array! {
            if let key = item[kSecAttrAccount as String] as? String,
                let value = item[kSecValueData as String] as? Data {
                values[key] = String(data: value, encoding:.utf8)
            }
        }
    }

    return values
}

Можно назвать как:

debugPrint(getAllKeyChainItemsOfClass(kSecClassGenericPassword as String))

Swift 4 update to @Cosmin answer

 [String:String] {

            let query: [String: Any] = [
                kSecClass as String : secClass,
                kSecReturnData as String  : kCFBooleanTrue,
                kSecReturnAttributes as String : kCFBooleanTrue,
                kSecReturnRef as String : kCFBooleanTrue,
                kSecMatchLimit as String: kSecMatchLimitAll
            ]

            var result: AnyObject?

            let lastResultCode = withUnsafeMutablePointer(to: &result) {
                SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
            }

            var values = [String:String]()
            if lastResultCode == noErr {
                let array = result as? Array<Dictionary<String, Any>>

                for item in array! {
                    if let key = item[kSecAttrAccount as String] as? String,
                        let value = item[kSecValueData as String] as? Data {
                        values[key] = String(data: value, encoding:.utf8)
                    }
                }
            }

            return values
        }
Решение Вопроса

SecItemCopyMatching это правильный вызов для этого. Сначала мы строим наш словарь запросов, чтобы элементы & apos; атрибуты возвращаются в словарях, и что возвращаются все элементы:

sAndKeys:
    (__bridge id)kCFBooleanTrue, (__bridge id)kSecReturnAttributes,
    (__bridge id)kSecMatchLimitAll, (__bridge id)kSecMatchLimit,
    nil];

КакSecItemCopyMatching требует как минимум класс возвращаемогоSecItems, мы создаем массив со всеми классами & # x2026;

NSArray *secItemClasses = [NSArray arrayWithObjects:
                           (__bridge id)kSecClassGenericPassword,
                           (__bridge id)kSecClassInternetPassword,
                           (__bridge id)kSecClassCertificate,
                           (__bridge id)kSecClassKey,
                           (__bridge id)kSecClassIdentity,
                           nil];

& # x2026; и для каждого класса установите класс в нашем запросе, вызовитеSecItemCopyMatchingи зарегистрируйте результат.

for (id secItemClass in secItemClasses) {
    [query setObject:secItemClass forKey:(__bridge id)kSecClass];

    CFTypeRef result = NULL;
    SecItemCopyMatching((__bridge CFDictionaryRef)query, &result);
    NSLog(@"%@", (__bridge id)result);
    if (result != NULL) CFRelease(result);
}

В рабочем коде вы должны проверить, чтоOSStatus вернулсяSecItemCopyMatching либоerrSecItemNotFound (ничего не найдено) илиerrSecSuccess (хотя бы один предмет был найден).

 12 апр. 2013 г., 12:43
Я получил все ноль в распечатке как на iPhone, так и на симуляторе. Есть ли что-то еще, что я должен сделать?
 31 июл. 2012 г., 14:55
Это. Я проверил это :)
 noamtm31 июл. 2012 г., 14:47
Спасибо! Еще не проверял, но выглядит как правильный ответ.
 20 июл. 2015 г., 20:10
Я попытался добавить встроенный сертификат (один сертификат, содержащий несколько), но он возвращает только одну запись. Есть ли выход или «SecItemAdd»? не добавляет их правильно? Есть идеи.
 12 апр. 2013 г., 13:09
Проверьте возвращаемое значениеSecItemCopyMatching, Если этоerrSecItemNotFoundвы не сохранили какие-либо элементы цепочки для ключей в своем приложении для iOS, вы не получите их обратно.

Ваш ответ на вопрос