CloudKit从开发环境部署到生产环境后无法获取userRecordID对应记录
问题:CloudKit生产环境无法获取用户关联的CKRecord
我开发的首款基于CloudKit的应用在开发环境运行正常,但部署到生产环境后无法正常工作。具体情况如下:
- 用户创建个人资料时,基于
Container.default().userRecordID()创建CKRecord并存储到公共容器,开发环境流程完全正常。 - 部署到生产环境用于TestFlight Beta测试后,开发与生产环境的
userRecordID一致,但通过该ID获取到的CKRecord中,userProfile字段返回nil(开发环境可正常获取),导致应用无法工作。
已做的配置:
- 在Entitlements文件中添加
com.apple.developer.icloud-container-environment并设置为Production - 目前仅通过模拟器测试,推测真机也无法正常运行
环境信息
- Xcode:14.0.1
- iOS:16.0
代码片段
import CloudKit final class CloudKitManager { static let shared = CloudKitManager() private init(){} var userRecord: CKRecord? var profileRecordID: CKRecord.ID? var clinicRecordID: CKRecord.ID? let container = CKContainer.default() var getUserRecordHasFired : Bool = false var accountStatus: CKAccountStatus = .couldNotDetermine func checkAccountStatus() async throws -> CKAccountStatus {try await container.accountStatus()} func getAccountStatus() async { do{ accountStatus = try await checkAccountStatus() print(accountStatus) } catch{ print(error.localizedDescription) } } func getUserRecord() async throws { let recordID = try await container.userRecordID() print(recordID) // 开发和生产环境均能返回recordID let record = try await container.publicCloudDatabase.record(for: recordID) userRecord = record print(record["userProfile"]) // 开发环境返回CKRecord,生产环境返回nil if let profileReference = record["userProfile"] as? CKRecord.Reference { profileRecordID = profileReference.recordID print("profile record ID \(profileRecordID)") guard let profileRecordID = profileRecordID else {return} let profileRecord = try await container.publicCloudDatabase.record(for: profileRecordID) let profile = DCProfile(record: profileRecord) clinicRecordID = profile.hasClinic.recordID } getUserRecordHasFired = true } }
可能的原因及解决方法
1. 开发与生产环境数据完全独立
CloudKit的开发环境和生产环境是两个完全隔离的数据库,你在开发环境创建的用户资料记录不会自动同步到生产环境。这意味着生产环境中根本不存在与该userRecordID关联的userProfile记录,自然返回nil。
- 解决:
- 方法一:在生产环境中使用测试账号重新完成个人资料创建流程,生成对应的关联记录。
- 方法二:通过CloudKit控制台将开发环境的记录迁移到生产环境(迁移前务必做好数据备份)。
2. 生产环境权限配置错误
检查生产环境公共数据库的权限规则,确保用户拥有读取自己关联记录的权限:
- 操作步骤:登录Apple开发者账号,进入CloudKit控制台,选择对应的生产容器,查看公共数据库的权限设置,确认针对User记录类型的
userProfile字段读取权限配置正确(比如允许记录所有者访问关联数据)。
3. Entitlements配置未正确生效
虽然你已添加com.apple.developer.icloud-container-environment配置,但可能存在Xcode打包时未正确应用的情况:
- 验证步骤:
- 打开Xcode项目的目标设置,进入
Signing & Capabilities页面。 - 确认iCloud模块下的容器环境已设置为
Production。 - 检查Entitlements文件中
com.apple.developer.icloud-container-environment的值确实为Production,且容器ID与生产环境一致。
- 打开Xcode项目的目标设置,进入
4. 测试流程存在问题
模拟器测试生产环境时,可能存在缓存或环境不一致的问题:
- 建议:使用真机安装TestFlight版本,登录测试账号后先完成个人资料创建操作,再测试获取功能,确保生产环境中已生成对应的关联记录。
5. 生产环境记录类型/字段配置不一致
确认生产环境的记录类型和字段与开发环境完全一致:
- 操作:在CloudKit控制台的生产环境中,检查User记录类型是否存在
userProfile字段,且字段类型为CKRecord.Reference,配置与开发环境完全匹配。
内容的提问来源于stack exchange,提问作者Sourabh
相关产品推荐
相关产品推荐

