2
votes

In the following link, there is the source code for a project that allows you to sync core data between the same user devices. Data is stored in User Private Database... is there a way to sync data from CoreData in public CloudKit database so the app will be the same between ALL app users? Why NSPersistentCloudKitContainer doesn't allow you to set this?

https://developer.apple.com/documentation/coredata/synchronizing_a_local_store_to_the_cloud

1
I haven't read the docs but I imagine it could be a load problem if many users were making changes to a shared db, the sync problem would be enormous.john elemans

1 Answers

7
votes

This is now possible in iOS 14.0+ Beta and macOS 11.0+ Beta via the new databaseScope property: https://developer.apple.com/documentation/coredata/nspersistentcloudkitcontaineroptions/3580372-databasescope

The possible values are .public (the public database), .private (the private database) and .shared (the shared database).

E.g.:

let container = NSPersistentCloudKitContainer(name: "test")
guard let description = container.persistentStoreDescriptions.first else {
    fatalError("Error")
}
description.cloudKitContainerOptions?.databaseScope = .public

The video https://developer.apple.com/videos/play/wwdc2020/10650 describes how to sync the Core Data store with the CloudKit public database by setting the databaseScope value to .public.

You may also need an #available check to ensure backwards compatibility, ie:

if #available(iOS 14.0, *) {
    description.cloudKitContainerOptions?.databaseScope = .public
} else {
    // Fallback on earlier versions
}