使用kSecMatchItemList的SecItemCopyMatching失败

时间:2015-05-26 02:27:01

标签: ios

我无法接听此呼叫以便为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.
    }
}

1 个答案:

答案 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上根本不可能。