14

Apple 在其GenericKeyChain 示例代码中提供了 KeyChainItemWrapper 类。SO上有一个ARC'ed解决方案,我正在尝试遵循:包装器存储在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 包含: 在此处输入图像描述

4

2 回答 2

15

我再也找不到这个 Apple 示例用于 Keychain 包装器的工作了。幸运的是,对此事的进一步研究揭示了这个对我有用的解决方案。

当心解决方案的原始答案不是 ARC'ed,但是有人非常好心地在 Github 上创建了一个 ARC'ed 版本。我用过那个,效果很好。

它是钥匙串的包装器,比原来的更简单。

希望这可以帮助其他有类似问题的人。

于 2013-11-07T09:48:24.700 回答
5

在模拟器上运行应用程序时我遇到了同样的错误,但它在设备上运行良好。

为了解决模拟器的问题,我必须打开“共享钥匙串权利”。

共享钥匙串权利

于 2016-10-10T20:43:19.750 回答