Приложение-уничтожитель связки ключей из-за необработанного исключения "NSInvalidArgumentException", причина: "-[_NSZeroData _fastCharacterContents]

Я использую оболочку для ключей, найденную здесь:

https://gist.github.com/1170641

Как это:

.h:

    #import "KeychainItemWrapper.h"

    KeychainItemWrapper *keychainItem;

.m:

 keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"login" accessGroup:nil];

NSString *password = [keychainItem objectForKey:(__bridge id)kSecValueData];
NSString *username = [keychainItem objectForKey:(__bridge id)kSecAttrAccount];

Затем он падает с:

Завершение работы приложения из-за невыполненного исключения "NSInvalidArgumentException", причина: "-[_NSZeroData _fastCharacterContents]: нераспознанный селектор, отправленный экземпляру 0x14dcba60"

РЕДАКТИРОВАТЬ:

Сбой больше не присутствует благодаря пользователю, который ответил на вопрос, но когда я получаю имя пользователя или пароль, они иногда меняются местами, и я имею в виду 80% времени.

2 ответа

Решение

Изменить: я использую kSecValueData, но закомментирован //#define PASSWORD_USES_DATA в KeychainItemWrapper.m. Также я начал использовать resetKeychainItem вместо того, чтобы пытаться переопределить ценности самостоятельно.

Старый ответ: У меня была эта проблема, пока я не изменил kSecValueData на kSecAttrService, который может использоваться для паролей также в соответствии с SecItem.h. Теперь все, кажется, работает нормально (установка и получение).

У меня была похожая проблема, и я исправил ее, изменив это:

NSString *password = [keychainItem objectForKey:(__bridge id)kSecValueData];
NSString *username = [keychainItem objectForKey:(__bridge id)kSecAttrAccount];

к этому:

NSString *password = [[NSString alloc] initWithData:[keychainItem objectForKey:(id)kSecValueData] encoding:NSUTF8StringEncoding];
NSString *username = [keychainItem objectForKey:(id)kSecAttrAccount];
Другие вопросы по тегам