Ios 与kSecMatchItemList的SecItemCopyMatching失败

Ios 与kSecMatchItemList的SecItemCopyMatching失败,ios,Ios,我很难让这个电话为IOS工作。我尝试了许多方法,但似乎都不起作用:我总是获得errSecParam的状态。谁能告诉我我做错了什么 我开始使用它来获取我从字节中提取的证书的属性列表。这不起作用,所以我把它简化为这个,并收到了相同的错误。我在模拟器和iPhone6上进行了测试,得到了相同的结果 首先,我获得一个证书数组,然后将该数组传递回SecItemCopyMatching。我试过这样做,只查询属性,但得到了相同的错误 我是IOS新手,所以我不怀疑这是我错过的 谢谢 // Call SecItem

我很难让这个电话为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.
    }
}

引用头文件文档:

@常量
kSecMatchItemList
仅限OS X。指定其值为SecKeychainItemRef项的CFArray的字典键。如果提供,返回的项目将限于此列表中包含的子集

我知道
\u OSX\u AVAILABLE\u start
声称它在iOS上存在,但这是一个谎言,在邮件列表上,一位苹果开发人员声称它从未在iOS上实现过

尝试使用
kSecUseItemList
设置相同的数组。根据邮件列表,这在当时也没有在iOS上实现,但如果苹果打算在iOS上实现任何一个(或者已经实现了),那就相当于
kSecUseItemList

macOS和iOS之间有许多奇怪的密钥链API差异,其中一些差异仅在文档中或仅在头文件中找到。下面是
SecItemDelete()
delete文档中的另一个示例:

要删除由临时引用标识的项,请在iOS上使用项引用指定kSecValueRef。在OSX上,提供一个包含项引用的kSecMatchItemList


在iOS上尝试使用
kSecMatchItemList
进行此操作将失败,就像在macOS上使用
kSecValueRef
似乎失败一样。这些API差异对我来说没有任何意义,但是您可以使用
kSecUseItemList
来实现,或者您运气不好,在iOS上根本不可能实现。

您是否尝试过将匹配限制设置为1而不是全部?我只是这样做了,但没有更改状态(errSecParam)。我真正的目标是使用此调用获取我使用SecCertificateCreateWithData创建的证书的属性。当这不起作用时,我试图将问题简化为这个问题,但它也不起作用。我想得到公钥散列,这是我从文档中看到的唯一方法。你知道另一种方法吗?谢谢你的建议。下次我进去时,我会试试你的建议。