我需要更新钥匙串条目的kSecAttrAccessible。我不需要更新实际数据,只需要更新可访问性属性。
首先,我尝试查找项目,以确保我的查询字典良好:
sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)(queryPrivateKey), (void *)&privateKeyRef);
这行代码成功地找到了我在查找的项目(返回码为0)。
然后,我使用相同的查询更新了kSecAttrAccessible属性:
if (sanityCheck == noErr && privateKeyRef != nil) {
// found it, update accessibility
NSMutableDictionary *updatedAttributes = [[NSMutableDictionary alloc] init];
updatedAttributes[(__bridge id)kSecAttrAccessible] = (__bridge id)kSecAttrAccessibleAlways;
OSStatus updateItemStatus = SecItemUpdate((__bridge CFDictionaryRef)queryPrivateKey, (__bridge CFDictionaryRef)updatedAttributes);
}
此时,updateItemStatus为-50(paramErr)。
我查看了这个线程:是否可以更新Keychain项目的kSecAttrAccessible值?然而我的问题是不同的。即使我将kSecValueData添加到我的
updatedAttributes
中,它也返回-50。此外,文档还指出,我们只需要为iOS 4及更早版本添加kSecValueData。我支持iOS 7及以上版本,所以这不应该是我的问题。有人能指出我在这里缺少什么吗?非常感谢。
SecItemUpdate()
不返回任何内容,它接受一个关于要更新的查询和一个描述如何更新它的更新描述,并且唯一的输出值是状态代码。因此,指定任何kSecReturn...
都没有意义,因为该值如何返回? - Mecki