Ios 与kSecMatchItemList的SecItemCopyMatching失败
我很难让这个电话为IOS工作。我尝试了许多方法,但似乎都不起作用:我总是获得errSecParam的状态。谁能告诉我我做错了什么 我开始使用它来获取我从字节中提取的证书的属性列表。这不起作用,所以我把它简化为这个,并收到了相同的错误。我在模拟器和iPhone6上进行了测试,得到了相同的结果 首先,我获得一个证书数组,然后将该数组传递回SecItemCopyMatching。我试过这样做,只查询属性,但得到了相同的错误 我是IOS新手,所以我不怀疑这是我错过的 谢谢Ios 与kSecMatchItemList的SecItemCopyMatching失败,ios,Ios,我很难让这个电话为IOS工作。我尝试了许多方法,但似乎都不起作用:我总是获得errSecParam的状态。谁能告诉我我做错了什么 我开始使用它来获取我从字节中提取的证书的属性列表。这不起作用,所以我把它简化为这个,并收到了相同的错误。我在模拟器和iPhone6上进行了测试,得到了相同的结果 首先,我获得一个证书数组,然后将该数组传递回SecItemCopyMatching。我试过这样做,只查询属性,但得到了相同的错误 我是IOS新手,所以我不怀疑这是我错过的 谢谢 // Call SecItem
// 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创建的证书的属性。当这不起作用时,我试图将问题简化为这个问题,但它也不起作用。我想得到公钥散列,这是我从文档中看到的唯一方法。你知道另一种方法吗?谢谢你的建议。下次我进去时,我会试试你的建议。