添加kSecAttrSynchronizable后私钥无法存入钥匙串,求解决方案
解决钥匙串同步私钥时的SecItemAdd错误
要解决添加kSecAttrSynchronizable后保存失败的问题,主要排查以下几个点,同时调整代码逻辑:
1. 检查iCloud钥匙串权限配置
首先必须开启Xcode项目的iCloud钥匙串权限:
- 打开项目,选中目标Target → 进入
Signing & Capabilities标签 - 点击
+ Capability,添加iCloud - 在iCloud配置中勾选
Keychain Sharing和iCloud Keychain(确保Provisioning Profile同步更新)
2. 处理重复条目冲突
如果之前已经保存过不带同步属性的同一条目(kSecAttrService和kSecAttrAccount相同),直接添加带同步属性的条目会触发errSecDuplicateItem错误。需要先查询现有条目,存在则更新,不存在再添加。
3. 添加错误捕获,定位具体问题
原代码没有处理SecItemAdd的返回值,无法知道具体错误类型。添加错误捕获后,可以根据错误码(比如权限缺失、重复条目)针对性修复。
修复后的完整代码
func save(userUID: String, privatekey: String) { guard let passwordData = privatekey.data(using: .utf8) else { print("私钥转Data失败") return } let service = "hustles/\(userUID)" // 查询是否存在已有条目 let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrService as String: service, kSecAttrAccount as String: userUID, kSecReturnAttributes as String: kCFBooleanTrue! ] var existingItem: CFTypeRef? let queryStatus = SecItemCopyMatching(query as CFDictionary, &existingItem) switch queryStatus { case errSecSuccess: // 更新已有条目,添加同步属性 let updateParams: [String: Any] = [ kSecValueData as String: passwordData, kSecAttrSynchronizable as String: kCFBooleanTrue! ] let updateStatus = SecItemUpdate(query as CFDictionary, updateParams as CFDictionary) if updateStatus != errSecSuccess { print("更新钥匙串条目失败,错误码: \(updateStatus)") } case errSecItemNotFound: // 添加新的带同步属性的条目 let addQuery: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrSynchronizable as String: kCFBooleanTrue!, kSecAttrService as String: service, kSecAttrAccount as String: userUID, kSecValueData as String: passwordData ] let addStatus = SecItemAdd(addQuery as CFDictionary, nil) if addStatus != errSecSuccess { print("添加钥匙串条目失败,错误码: \(addStatus)") } default: print("查询钥匙串条目失败,错误码: \(queryStatus)") } }
额外注意事项
- 测试必须使用真机,模拟器的iCloud钥匙串同步功能不稳定
- 确保所有要同步的设备都登录了同一个Apple ID,并且在系统设置中开启了
iCloud > 钥匙串 - 如果错误码是
errSecMissingEntitlement,检查Provisioning Profile是否包含iCloud钥匙串权限,重新生成并下载配置文件
内容的提问来源于stack exchange,提问作者Ahmed Zaidan
相关产品推荐
相关产品推荐

