Возможно ли обновить значение атрибута kSecAttrAccessible существующих элементов в цепочке ключей? Кажется, что он не может быть изменен после добавления элемента в брелок. Следующие шаги подтверждают мое предположение.
Добавить новый элемент в брелок:
NSData *encodedIdentifier = [@"BUNDLE_IDENTIFIER"
dataUsingEncoding:NSUTF8StringEncoding];
NSData *encodedPassword = [@"PASSWORD"
dataUsingEncoding:NSUTF8StringEncoding];
// Construct a Keychain item
NSDictionary *keychainItem =
[NSDictionary dictionaryWithObjectsAndKeys:
kSecClassGenericPassword, kSecClass,
encodedIdentifier, kSecAttrGeneric,
encodedIdentifier, kSecAttrService,
@"USERNAME", kSecAttrAccount,
kSecAttrAccessibleWhenUnlocked, kSecAttrAccessible,
encodedPassword, kSecValueData
nil];
// Add item to Keychain
OSStatus addItemStatus = SecItemAdd((CFDictionaryRef)keychainItem, NULL);
В более позднее время измените атрибут kSecAttrAccessible от kSecAttrAccessibleWhenUnlocked до kSecAttrAccessibleAfterFirstUnlock:
NSData *encodedIdentifier = [@"BUNDLE_IDENTIFIER"
dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys:
kSecClassGenericPassword, kSecClass,
encodedIdentifier, kSecAttrGeneric,
encodedIdentifier, kSecAttrService,
nil];
NSDictionary *updatedAttributes =
[NSDictionary dictionaryWithObject:kSecAttrAccessibleAfterFirstUnlock
forKey:kSecAttrAccessible];
OSStatus updateItemStatus = SecItemUpdate((CFDictionaryRef)query,
(CFDictionaryRef)updatedAttributes);
Проблема с этим подходом заключается в том, что updateItemStatus всегда приводит к статусу errSecUnimplemented.
Я думаю, что должно быть возможно обновить значение kSecAttrAccessible, потому что требования приложений меняются. Что делать, если приложение добавило десять элементов в брелок в прошлом, не указав класс защиты с kSecAttrAccessible. Keychain неявно назначает новым элементам значение kSecAttrAccessibleWhenUnlocked, если класс защиты не задан явно разработчиком. Позже разработчику необходимо изменить класс защиты на kSecAttrAccessibleAfterFirstUnlock, потому что приложение должно получить к нему доступ в фоновом режиме (многозадачность). Как разработчик может это сделать?
На форумах разработчиков Apple уже есть поток, но пока он еще не дал ответа: https://devforums.apple.com/thread/87646?tstart=0