2013-11-03 46 views
14

Apple在其GenericKeyChain sample code中提供了KeyChainItemWrapper类。在这里有一个ARC的解决方案,我试图遵循:wrapper存储在iOS上的KeyChain上。保存在KeyChainItemWrapper中的密码崩溃

包装的使用是这样的:

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方法。正如我所期待的,这在某种程度上与钥匙串直接处理...

keychainItemData包含: enter image description here

+0

什么意思是没有任何代码?你是否希望我复制并粘贴上面链接的整个包装器?我已经向你展示了我所做的。 (它的苹果包装,它的第三方,点击给定的链接,在这里垃圾评论之前) – Houman

+0

Daij-Djan,我不知道你是否有一个糟糕的一天,或者你只是表现幼稚。首先你是垃圾评论,没有理由你开始downvoting /关闭,然后删除你自己的意见,不追溯。如果你不想帮忙,那很好。你做什么没有帮助,也没有专业。 – Houman

+0

使用调试器并查看'SecItemAdd'的返回值(更新日志语句以包含结果代码)。然后搜索“无法添加Keychain项目”错误消息并找到引用相同错误代码的错误消息。似乎有几个可能的原因。错误代码会缩小很多。 – rmaddy

回答

15

我无法得到钥匙串包装工作这个苹果例如下去了。 幸运的是,对这件事的进一步研究揭示了这个solution,它为我工作。

小心解决方案的原始答案不是ARC'ed,但有人很善良创建一个ARC'ed version on Github。我使用那个,像魅力一样工作。

它是一个围绕钥匙链的包装,它比原来的包装更简单。

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

+2

JNKeychain对我表示感谢! – malhal

+0

它支持团体 – vatti

5

我在模拟器上运行应用程序时有同样的错误,但它在设备上运行完美。

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

Share keychain entitlement

+0

把这个问题解决了我的问题。谢谢! –