iOS KeyChain secItemAdd崩溃

时间:2014-05-16 13:18:16

标签: ios objective-c keychain

我正在尝试使用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
};

2 个答案:

答案 0 :(得分:2)

来自文档:

  

要获取添加项目的数据作为CFDataRef类型的对象,   指定返回类型键kSecReturnData,其值为   kCFBooleanTrue。

答案 1 :(得分:-1)

您获得EXC_BAD_ACCESS的原因的答案是因为您传入SecItemAdd的字典必须是可变的。

尝试这样的事情:

  

CFMutableDictionaryRef attributes = CFDictionaryCreateMutable(NULL,size,   &安培; kCFCopyStringDictionaryKeyCallBacks,   &安培; kCFTypeDictionaryValueCallBacks);

     

CFDictionaryAddValue(attributes,keys [x],values [x]);