Приложение-уничтожитель связки ключей из-за необработанного исключения "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];