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包含:
什么意思是没有任何代码?你是否希望我复制并粘贴上面链接的整个包装器?我已经向你展示了我所做的。 (它的苹果包装,它的第三方,点击给定的链接,在这里垃圾评论之前) – Houman
Daij-Djan,我不知道你是否有一个糟糕的一天,或者你只是表现幼稚。首先你是垃圾评论,没有理由你开始downvoting /关闭,然后删除你自己的意见,不追溯。如果你不想帮忙,那很好。你做什么没有帮助,也没有专业。 – Houman
使用调试器并查看'SecItemAdd'的返回值(更新日志语句以包含结果代码)。然后搜索“无法添加Keychain项目”错误消息并找到引用相同错误代码的错误消息。似乎有几个可能的原因。错误代码会缩小很多。 – rmaddy