我正在使用此处的钥匙串包装器:
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%的时间。
答案 0 :(得分:3)
编辑:
我正在使用kSecValueData,但在KeychainItemWrapper.m中注释掉了//#define PASSWORD_USES_DATA
。此外,我开始使用resetKeychainItem
而不是尝试自己覆盖值。
旧答案: 我遇到了这个问题,直到我将kSecValueData更改为kSecAttrService,根据SecItem.h,它也可以用于密码。现在一切似乎都很好(设置和检索)。
答案 1 :(得分:1)
我有一个类似的问题,我通过改变它来修复它:
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];