我正在尝试使用KeyChain并且没有包装器。但是当我想要读取值时,我的代码崩溃了。
代码:
CFDictionaryRef attributes = CFDictionaryCreate(NULL, keys, values, 5, NULL, NULL);
CFDataRef result;
OSStatus status = SecItemAdd(attributes, (CFTypeRef *)&result);
if (status == errSecSuccess) {
if (result && CFGetTypeID(result) == CFDataGetTypeID()) { //crashes here
NSLog(@"Data");
}
isSuccess = YES;
} else {
fprintf(stderr, "Error while inserting into keychain osstatus:%ld\n", status);
}
错误:EXC_BAD_ACCESS
我做错了什么?我认为SecItemAdd可以返回新添加的项目
编辑:
const void *keys[] = {
kSecClass
, kSecAttrAccessible
, kSecAttrService
, kSecAttrAccount
, kSecValueData
};
const void *values[] = {
kSecClassGenericPassword
, kSecAttrAccessibleWhenUnlocked
, (__bridge CFStringRef)service
, (__bridge CFStringRef)account
, data //CFDataRef
};
答案 0 :(得分:2)
来自文档:
要获取添加项目的数据作为CFDataRef类型的对象, 指定返回类型键kSecReturnData,其值为 kCFBooleanTrue。
答案 1 :(得分:-1)
您获得EXC_BAD_ACCESS的原因的答案是因为您传入SecItemAdd的字典必须是可变的。
尝试这样的事情:
CFMutableDictionaryRef attributes = CFDictionaryCreateMutable(NULL,size, &安培; kCFCopyStringDictionaryKeyCallBacks, &安培; kCFTypeDictionaryValueCallBacks);
CFDictionaryAddValue(attributes,keys [x],values [x]);