Xcode13/iOS15下CloudKit公共数据库报Custom zones are not allowed in public DB错误
问题原因
这是iOS 15/Xcode 13版本中CoreData与CloudKit集成的默认行为变更导致的问题,不属于操作错误或者配置错误。
iOS 14版本中,CoreData的CloudKit镜像代理针对公共数据库会默认使用CloudKit公共库的默认zone(_defaultZone),而iOS 15开始,镜像代理默认会尝试创建CoreData专属的自定义zone用于数据同步,但CloudKit公共数据库不允许创建自定义zone,因此在应用重启、镜像代理重新初始化时会抛出Custom zones are not allowed in public DB错误。
解决方案
按照如下步骤调整配置即可修复:
- 修改持久化存储配置
在你现有设置databaseScope = .public的代码后,追加配置明确指定使用公共数据库的默认zone,禁止创建自定义zone:
// 你已有的配置 guard let description = container.persistentStoreDescriptions.first else { fatalError("Something bad happened") } description.cloudKitContainerOptions?.databaseScope = .public // 新增配置开始 // 指定使用CloudKit公共库的默认zone description.cloudKitContainerOptions?.zoneID = CKRecordZone.default().zoneID // 开启持久化历史跟踪和远程变更通知(公共库同步必填) description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey) description.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey) // 新增配置结束
- 清理残留的错误状态
卸载测试设备上的现有应用,清空Xcode的DerivedData缓存,避免本地残留之前的自定义zone创建请求影响同步。 - 验证同步效果
重新运行应用添加测试数据,确认CloudKit Dashboard公共数据库的_defaultZone下可以看到新增的记录,重启应用后新增数据也能正常同步无报错。
内容的提问来源于stack exchange,提问作者Snark2021
相关产品推荐
相关产品推荐

