My use case is the following:
Every user of my app can create as an owner a set of items.
These items are private until the owner invites other users to share all of them as participant.
Participants can modify the shared items and/or add other items.
So, sharing is not done related to individual items, but to all items of an owner.
I want to use CoreData & CloudKit to do CoreData/CloudKit mirroring and to have local copies of private and shared items. To my understanding, CoreData & CloudKit puts all mirrored items in the private database in a special zone „com.apple.coredata.cloudkit.zone“. So, this zone should be shared, i.e. all items in it.
In the WWDC 2021 video „Build apps that share data through CloudKit and Core Data“ it is said that NSPersistentCloudKitContainer
uses Record Zone Sharing optionally in contrast to hierarchically record sharing using a root record.
In the docs to the UICloudSharingController
an example is given how to share records using a rootRecord
.
I assume this can be modified to use a shared record zone instead.
The shareRecord
e.g. could be initiated instead with
let shareRecord = CKShare(rootRecord: rootRecord)
with
let shareRecord = CKShare.init(recordZoneID:)
But is this the ID of the record zone that uses Apple for mirroring, i.e. „com.apple.coredata.cloudkit.zone“? And if so, how do I get its CKRecordZone.ID
, if I have only the zone name?
By now I figured out how this can be done. Maybe it helps somebody else.
It starts with tapping a share button.
First, it is checked if a
CKShare
record already exists in the iCloud private database. Depending on it, aUICloudSharingController
is initialized either so that it created it, or so that it uses it. If it should create the share, it is configured accordingly.