My app uses cloudkit+coredata, syncing works fine util i found recent items not appear on another iphone one day, I think the syncing stopped. so i add some debug information and error occurs:
21-12-10 16:13:58.089 CKDBManager[128], processCloudkitEventChanged(:)[c]: Event(setup) started 21-12-10 16:13:58.301 CKDBManager[133], processCloudkitEventChanged(:)[c]: Event(setup) finished in 0.21s with success 21-12-10 16:14:01.218 CKDBManager[128], processCloudkitEventChanged(:)[c]: Event(setup) started 21-12-10 16:14:01.280 CKDBManager[133], processCloudkitEventChanged(:)[c]: Event(setup) finished in 0.06s with success 21-12-10 16:14:01.286 CKDBManager[128], processCloudkitEventChanged(:)[c]: Event(import) started 21-12-10 16:14:02.372 CKDBManager[133], processCloudkitEventChanged(:)[c]: Event(import) finished in 1.09s with success 21-12-10 16:14:02.378 CKDBManager[128], processCloudkitEventChanged(:)[c]: Event(export) started 21-12-10 16:14:02.388 CKDBManager[133], processCloudkitEventChanged(:)[c]: Event(export) finished in 0.01s with success 21-12-10 16:14:12.741 CKDBManager[128], processCloudkitEventChanged(:)[c]: Event(export) started 21-12-10 16:14:12.756 CKDBManager[133], processCloudkitEventChanged(:)[c]: Event(export) finished in 0.02s with success 21-12-10 16:14:12.762 CKDBManager[128], processCloudkitEventChanged(:)[c]: Event(import) started 21-12-10 16:14:13.169 CKDBManager[131], processCloudkitEventChanged(:)[c]: Event(import) error: Error Domain=CKErrorDomain Code=12 "(null)"
first, I cannot find description of CKErrorDomain Code=12. but the most important is how can i restore syncing between coredata and cloudkit without data loss on iphone(already so many data)?
the code shows as following:
NotificationCenter.default
.publisher(for: NSPersistentCloudKitContainer.eventChangedNotification)
.sink { [weak self] notification in
guard let self = self else { return }
self.processCloudkitEventChanged(notification)
}
.store(in: &subscriptions)
private func processCloudkitEventChanged(_ notification: Notification) {
guard let cloudEvent = notification.userInfo?[NSPersistentCloudKitContainer.eventNotificationUserInfoKey]
as? NSPersistentCloudKitContainer.Event else { return }
var eventTypeString = "";
switch cloudEvent.type {
case .setup: eventTypeString = "setup"
case .import: eventTypeString = "import"
case .export: eventTypeString = "export"
@unknown default: eventTypeString = "unknown"
}
if cloudEvent.endDate == nil {
foolPrint("Event(\(eventTypeString)) started")
} else {
if let error = cloudEvent.error {
foolPrint("Event(\(eventTypeString)) error: \(error)")
} else {
foolPrint("Event(\(eventTypeString)) finished in \(String(format: "%.2f", cloudEvent.endDate?.timeIntervalSince(cloudEvent.startDate) ?? 0))s with \(cloudEvent.succeeded ? "success" : "failure")")
}
}
}
error logs after enable system cloudkit debug info:
2021-12-10 17:34:44.041410+0800 Listening[30856:17878746] [error] error: CoreData+CloudKit: -NSCloudKitMirroringDelegate recoverFromError:: <NSCloudKitMirroringDelegate: 0x2834d0000> - Attempting recovery from error: <CKError 0x2800e4b40: "Partial Failure" (2/1011); "Failed to modify some record zones"; uuid = 4A785529-CF0B-42E4-99B5-5x; container ID = "iCloud.com.y.x"; partial errors: { com.apple.coredata.cloudkit.zone:defaultOwner = <CKError 0x2800fca80: "Server Rejected Request" (15/2027); server message = "Custom zones are not allowed in public DB"; op = 8C27C3373F4F1480; uuid = 4A785529-CF0B-42E4-99B5-5x> }>
NSCloudKitMirroringDelegate: 0x2834d40d0> - Ignoring remote change notification because it's for a different store: 2B6EC011-682C-4F95-x-910FC6ECDB81 / 2B6EC011-682C-4F95-x-910FC6ECDB81