Сохранение в KeyChainItemWrapper сбоев для пароля

Apple предоставила класс KeyChainItemWrapper в своем примерном коде GenericKeyChain. На SO есть решение ARC, которое я пытаюсь выполнить: wrapper для хранения в KeyChain на iOS.

Использование обертки выглядит следующим образом:

KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"F11-email-auth" accessGroup:nil];
[keychain setObject:[emailTextfield text] forKey:(__bridge id)(kSecMatchEmailAddressIfPresent)];
[keychain setObject:[passwordTextfield text] forKey:(__bridge id)(kSecClassGenericPassword)];

принимается строка с текстовым полем электронной почты. Но вторая строка с паролем выходит из строя со следующим исключением.

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Couldn't add the Keychain Item.'
*** First throw call stack:
(
    0   CoreFoundation                      0x01b445e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x018c78b6 objc_exception_throw + 44
    2   CoreFoundation                      0x01b44448 +[NSException raise:format:arguments:] + 136
    3   Foundation                          0x014a823e -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
    4   Feeltracker                         0x000053b3 -[KeychainItemWrapper writeToKeychain] + 899
    5   Feeltracker                         0x00004700 -[KeychainItemWrapper setObject:forKey:] + 272
    6   Feeltracker                         0x000092d6 -[FTLoginViewController connectToAccount:] + 374
    7   libobjc.A.dylib                     0x018d9874 -

В чем может быть причина? Интересно, имеет ли это какое-либо отношение к константам, которые я использую.

UPDATE:

Благодаря помощи rmaddy:

Это бит, который, кажется, бросает ошибку:

// No previous item found; add the new one.
result = SecItemAdd((__bridge CFDictionaryRef)[self dictionaryToSecItemFormat:keychainItemData], NULL);
NSAssert( result == noErr, @"Couldn't add the Keychain Item." );

результат равен -50. SecItemAdd - это метод lib. Как я и ожидал, это как-то связано с обработкой KeyChain напрямую...

keychainItemData содержит: enter image description here

Ответы

Ответ 1

Я больше не мог использовать этот пример Apple для оболочки оболочки Keychain. К счастью, дальнейшее исследование этого вопроса показало это решение, которое сработало для меня.

Опасайтесь, что исходный ответ на решение не ARC'ed, однако кто-то был так добр, чтобы создать ARC'ed версию на Github, Я использовал этот и работает как шарм.

Это оболочка вокруг брелка, которая работает даже проще оригинальной.

Надеюсь, что это поможет другим с аналогичной проблемой.

Ответ 2

У меня была такая же ошибка при запуске приложения на симуляторе, но она отлично работала на устройстве.

Чтобы устранить проблему с симулятором, мне пришлось включить "Share keychain license".

Предоставить доступ к брелокам