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

iOS 15 Core Data同步CloudKit公共数据库报不允许自定义区域错误

错误根因

Core Data 与 CloudKit 集成的默认逻辑会自动生成专属自定义 zone 用于数据同步,而 CloudKit 公共数据库不支持任何自定义 zone,仅能使用系统提供的默认 zone。即便你未手动创建自定义 zone,Core Data 的默认同步逻辑也会尝试在公共数据库中创建自定义 zone,触发 Custom zones are not allowed in public DB 报错。

解决方案
  • 手动指定 Core Data 同步使用 CloudKit 公共数据库的默认 zone,关闭自动创建自定义 zone 的逻辑,完整配置示例如下:
let container = NSPersistentCloudKitContainer(name: "你的Core Data模型名称")
guard let description = container.persistentStoreDescriptions.first else {
    fatalError("无法获取持久化存储描述")
}
// 配置CloudKit容器选项
let cloudKitOptions = NSPersistentCloudKitContainerOptions(containerIdentifier: "iCloud.你的CloudKit容器ID")
cloudKitOptions.databaseScope = .public
// 核心配置:强制指定使用公共数据库的默认zone,避免创建自定义zone
cloudKitOptions.zoneID = CKRecordZone.default().zoneID
description.cloudKitContainerOptions = cloudKitOptions

// CloudKit同步必需的基础配置
description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
description.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)

// 加载持久化存储
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
    if let error = error as NSError? {
        fatalError("持久化存储加载失败: \(error), \(error.userInfo)")
    }
})
  • 清理本地旧同步缓存:如果配置后仍报错,可卸载应用重装,或在加载持久化存储时临时添加清空同步元数据的配置:
description.setOption(true as NSNumber, forKey: NSPersistentStoreRebuildFromUbiquitousContentOptionKey)

注意:该配置仅首次修复时添加,正常使用时需要移除,避免每次启动都清空本地同步数据。

  • 检查CloudKit控制台公共数据库分区,确认没有残留的自定义zone,如有手动删除后再测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:15:03