You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加/更新Keychain值时遇errSecNoSuchAttr(-25303)错误,移除kSecClass却正常?

问题原因与解决方案

你遇到的errSecNoSuchAttr(-25303)错误,核心原因是Keychain API无法识别字符串类型的属性键。你的代码将原本CFString类型的键转换成了String类型,导致必填的kSecClass属性无法被Keychain识别,从而触发错误。

代码中的问题点

你的代码最后一步把[CFString: Any?]通过as ["String": Any]转换成了字符串键的字典:

return dictionary.compactMapValues { $0 } as ["String": Any]

Keychain的SecItem系列函数依赖CFString类型的常量(比如kSecClass、kSecAttrAccount)作为键来识别属性,即使字符串内容一致,类型不匹配也会被判定为无效属性。移除kSecClass后API能工作,只是巧合某些字符串键被“兼容”识别,但这不符合Keychain的规范用法。

修复方案

修改itemDictionary的类型为[CFString: Any],保持键的CFString类型:

public var itemDictionary: [CFString: Any] {
    let dictionary: [CFString: Any?] = [
        kSecAttrAccessGroup: accessGroup, // nil
        kSecAttrService: service, // nil
        kSecClass: kSecClassGenericPassword,
        kSecAttrAccount: account,
        kSecAttrSynchronizable: synchronizable, // false
        kSecAttrAccessible: access.queryValue,
        kSecValueData: data
    ]
    return dictionary.compactMapValues { $0 } as [CFString: Any]
}

额外注意事项

调用SecItemUpdate时需要区分两个字典:

  • 查询字典(用于定位要更新的项)必须包含kSecClass;
  • 更新字典(用于设置新值)不能包含kSecClass——Keychain不允许修改项的类型。

内容的提问来源于stack exchange,提问作者Jake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:40:28