我无法接听此呼叫以便为IOS工作。我尝试了很多方法,但似乎没有任何工作:我总是得到errSecParam的状态。谁能告诉我我做错了什么?
我开始使用它来获取我从字节中水合的证书的属性列表。这没用,所以我把它减少到了这个并收到了同样的错误。我已经在模拟器和iPhone6上进行了测试并得到了相同的结果。
首先,我获得了一系列证书,然后将数组传回SecItemCopyMatching。我试过这个,我只查询属性并得到同样的错误。
我是IOS的新手,所以我不怀疑这是我错过的。
感谢。
// Call SecItemCopyMatching twice: the first time fetch an array of certificates
// and the second time use the array with kSecMatchItemList.
- (void) SecItemCopyMatchingTest2 {
// Now read them from the keychain.
NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys:
(__bridge id)kSecClassCertificate,(__bridge id)kSecClass,
(__bridge id)kCFBooleanTrue, (__bridge id)kSecReturnRef,
(__bridge id)kSecMatchLimitAll, (__bridge id)kSecMatchLimit,
nil];
CFTypeRef result;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result);
NSArray *rgRefs = CFBridgingRelease(result);
if (status == noErr){
// this works
}
// Use the array we received from our previous call
[query setObject:rgRefs forKey:(__bridge id)kSecMatchItemList];
CFTypeRef result2;
// Results in status = errSecParam
status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result2);
if (status == errSecParam){
// the cal fails.
}
}
答案 0 :(得分:0)
来自头文件文档的引用:
@constant
kSecMatchItemList
仅限OS X 。指定字典键,其值为SecKeychainItemRef项的CFArray。如果提供,则返回的项目将限于此列表中包含的子集。
我知道__OSX_AVAILABLE_STARTING
声称它存在于iOS但这是谎言,在邮件列表上,Apple开发人员声称它从未在iOS上实现过。
尝试使用kSecUseItemList
设置相同的数组。根据邮件列表,当时没有为iOS实现这一点,但如果Apple要为iOS实现任一个(或者已经这样做了),那么它更像kSecUseItemList
。< / p>
macOS和iOS之间存在许多奇怪的钥匙串API差异,其中一些仅在文档中或在头文件中找到。以下是SecItemDelete()
删除文档中的另一个示例:
要删除由瞬态引用标识的项目,请在iOS上使用项目引用指定kSecValueRef。在OS X上,提供包含项目引用的kSecMatchItemList。
尝试在iOS上使用kSecMatchItemList
会失败,就像在macOS上使用kSecValueRef
似乎失败一样。这些API差异对我没有任何意义,但要么你可以使用kSecUseItemList
,要么运气不好,而且在iOS上根本不可能。