iOS 设置kSecAttrSynchronizable为kCFBooleanTrue后Keychain无法同步iCloud
iCloud Keychain 跨设备同步失败解决方案
- 优先排查查询逻辑遗漏参数问题
90% 以上的同类问题都是存储时添加了kSecAttrSynchronizable标记,但查询Keychain时没有传入对应标记导致的。系统默认仅查询本地非同步的Keychain项,你需要在查询的参数字典中添加如下任意一项配置:// 仅查询允许iCloud同步的项 kSecAttrSynchronizable as String: kCFBooleanTrue! // 同时查询本地和iCloud同步的项 kSecAttrSynchronizable as String: kSecAttrSynchronizableAny - 确认AccessGroup配置完全一致
你传入的kSecAttrAccessGroup参数必须完整匹配「TeamID + 组名」的格式,两台设备安装的App需要属于同一个开发者账号,且在Xcode的Signing & Capabilities中同时开启了Keychain Sharing并添加了完全相同的访问组,同时要勾选iCloud能力下的Keychain Sync选项。 - 先验证存储操作是否成功
执行存储Keychain的代码后,要捕获返回的OSStatus状态码判断是否存储成功:
状态码为noErr(0) 代表存储成功,状态码为-34018代表Keychain权限配置错误,-25299代表对应账号的Keychain项已存在需要走更新逻辑。 - 模拟器适配相关处理
Xcode模拟器的iCloud Keychain同步本身存在较多已知兼容性问题,可按如下顺序排查:- 优先使用真机调试验证,排除模拟器本身的bug影响
- 若必须使用模拟器,先重启两台模拟器后重新登录同一iCloud账号,确认账号的iCloud Keychain开关处于开启状态
- iOS 15+ 版本的模拟器需要在App的Scheme运行参数中添加配置:
-com.apple.security.keychainiCloudSyncEnabled 1 - 存储完成后等待30-60秒再手动触发
Trigger iCloud Sync,确认两台模拟器的网络可以正常访问苹果服务器
内容的提问来源于stack exchange,提问作者Abhijeet Barge
相关产品推荐
相关产品推荐

