我正在尝试获取CFDataRef
身份的SecIdentityRef
持久引用。但是,当使用apple提供的标准代码时,该函数为CFDataRef
返回0x0。输入参数不是nil,但是由于某种原因它不再起作用。该代码可以完美地工作。
CFTypeRef persistent_ref;
CFDataRef persistentRefForIdentity(SecIdentityRef identity)
{
const void *keys[] = { kSecReturnPersistentRef, kSecValueRef };
const void *values[] = { kCFBooleanTrue, identity };
CFDictionaryRef dict = CFDictionaryCreate(NULL, keys, values, 2, NULL, NULL);
OSStatus status = SecItemAdd(dict, &persistent_ref); // `SecItemAdd` returns 0
if (dict)
CFRelease(dict);
return (CFDataRef)persistent_ref;
}
status
为0,但persistent_ref
仍然没有值。有人知道出什么事了吗?
最佳答案
使CFTypeRefpersistent_ref为局部变量。或确保在调用SecItemAdd函数之前将其设置为NULL。请参见下面的代码。
CFDataRef persistentRefForIdentity (SecIdentityRef identity)
{
OSStatus status = errSecSuccess;
CFTypeRef persistent_ref = NULL;
const void *keys[] = { kSecReturnPersistentRef, kSecValueRef };
const void *values[] = { kCFBooleanTrue, identity };
CFDictionaryRef dict = CFDictionaryCreate(NULL, keys, values, 2, NULL, NULL);
// Delete anything already added
SecItemDelete(dict);
//Add the new one
status = SecItemAdd (dict, &persistent_ref);
if (status != errSecSuccess)
return nil;
if (dict)
CFRelease(dict);
return (CFDataRef)persistent_ref;
}
关于ios - 使用CFDataRef将证书保存到钥匙串(keychain),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25971840/