Apple已在其GenericKeyChain sample code中提供了KeyChainItemWrapper类。这里有一个关于SO的ARC'ed解决方案,我试图遵循:wrapper存储在iOS上的KeyChain中。
包装器的用法如下:
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 -
可能是什么原因?我想知道它是否与我正在使用的常数有关。
更新
感谢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包含:
答案 0 :(得分:15)
我无法再为Keychain包装工作获得这个Apple示例。 幸运的是,对此事的进一步研究揭示了这个solution,这对我有用。
请注意,解决方案的原始答案不是ARC,但有人非常善于创建ARC'ed version on Github。我用过那个,就像一个魅力。
它是钥匙串的包装,比原来的更简单。
希望这可以帮助其他人解决类似问题。
答案 1 :(得分:5)