查询带相同标签的钥匙串项时遭遇errSecParam错误求助
解决钥匙串查询errSecParam(-50)错误
你的查询字典缺少返回结果类型参数,这是导致errSecParam(-50)参数无效错误的核心原因。SecItemCopyMatching要求必须明确指定要返回钥匙串项的哪些数据,否则系统无法执行查询。
错误分析
不管设置kSecMatchLimit为kSecMatchLimitAll还是kSecMatchLimitOne,查询字典都必须包含至少一个返回类型参数:
kSecReturnAttributes:返回钥匙串项的属性字典kSecReturnData:返回钥匙串项的加密数据(比如密码内容)kSecReturnRef:返回钥匙串项的引用对象
修改后的查询代码
如果需要获取匹配项的属性信息,修改查询字典如下:
var request: [CFString: Any] = [ kSecClass: kSecClassGenericPassword, kSecMatchLimit: kSecMatchLimitAll, kSecAttrLabel: "some common label here", kSecReturnAttributes: kCFBooleanTrue // 新增:指定返回属性 ]
如果同时需要获取密码数据,再添加kSecReturnData: kCFBooleanTrue:
var request: [CFString: Any] = [ kSecClass: kSecClassGenericPassword, kSecMatchLimit: kSecMatchLimitAll, kSecAttrLabel: "some common label here", kSecReturnAttributes: kCFBooleanTrue, kSecReturnData: kCFBooleanTrue ]
结果处理
- 当
kSecMatchLimit为kSecMatchLimitAll时,成功查询后item会是CFArray类型,可转换为[[String: Any]]遍历处理每个匹配项 - 当
kSecMatchLimit为kSecMatchLimitOne时,item会是[String: Any]类型的单个属性字典(如果包含kSecReturnData则会带有kSecValueData字段)
内容的提问来源于stack exchange,提问作者Ikhs
相关产品推荐
相关产品推荐

