По какой-то причине я получил пустой словарь при вызове SecItemCopyMatching на OSX 10.8.4. Соответствующий элемент находится в цепочке ключей и содержит имя пользователя и пароль. SecItemCopyMatching находит его (errSecSuccess), но словарь результатов всего содержит 0 записей. Я бы ожидал, что у него будут хотя бы данные о имени пользователя и пароле, поэтому что случилось с моим запросом?SecItemCopyMatching возвращает пустой словарь
OSStatus status;
NSMutableDictionary *query = [NSMutableDictionary dictionary];
[query setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
[query setObject:(id)kSecReturnAttributes forKey:(id)kCFBooleanTrue];
[query setObject:@"MyService" forKey:(id)kSecAttrService];
CFDictionaryRef dictRef = NULL;
status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&dictRef);
if (status != errSecSuccess) {
CFStringRef errorRef = SecCopyErrorMessageString(status, NULL);
NSLog(@"%s: %@", __FUNCTION__, (__bridge NSString *)errorRef);
CFRelease(errorRef);
return nil;
}
// --> dictRef empty
if (dictRef != NULL) CFRelease(dictRef);
Я не могу сразу увидеть, почему вы получаете пустой словарь назад, но неудивительно, что пароль не возвращается. Документация заголовка для kSecReturnAttributes говорит: _Specify ключ словаря, значение которого имеет тип CFBooleanRef. Значение kCFBooleanTrue указывает, что должны быть возвращены (нешифрованные) атрибуты элемента (в CFDictionaryRef). – bdash
Вы правы, он не просил разрешить доступ к цепочке ключей. И есть глупая ошибка в запросе: [query setObject: (id) kCFBooleanTrue forKey: (id) kSecReturnAttributes]; – Gamadril