如何在 Cloudkit 中创建新的共享记录而不是父项的所有者?

How to create a new shared record in Cloudkit without being the owner of the parent?

我正在开发一个基本上类似于共享购物清单的应用程序。我愿意用Cloudkit.

单独分享每个购物清单项目没有意义,因此我们的想法是在列表级别创建分享。这样,列表中的所有项目都会共享,如

所述

我已经成功实现了这个想法。基本上,列表的所有者可以创建项目,并且每次创建项目时,已同意与所有者共享列表的用户可以在 Shared Database 中看到新项目。我还检查过,当用户修改其 Shared Database 中的现有记录时,修改会反映在所有者的 Private Database 中。

现在的问题是,不是列表所有者的人可能想要创建新项目。基本上,如果 2 个人共享一个购物清单,他们都应该能够在清单上添加新的东西来购买! 这似乎在 Cloudkit 上是不可能的。换句话说,似乎只有 parent 记录的所有者才能创建子记录。有没有人找到这种用例的解决方案?

我在调查更多之后回答我自己的问题。

如果不是所有者,似乎无法在 Cloudkit 控制台中创建共享记录,但可以从 Swift 开始。

这是一个代码示例:

      let sharedDatabase = CKContainer.default().sharedCloudDatabase
        sharedDatabase.fetchAllRecordZones { (recordZone, error) in
            let myZoneID = recordZone![0].zoneID//Temporary hack
            let query = CKQuery(recordType: "parentRecordType", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil))
            sharedDatabase.perform(query, inZoneWith: myZoneID) { (records, error) in
                print(records)
                let newID = CKRecord.ID(zoneID: myZoneID)
                let nameRecord = CKRecord(recordType: "childRecordType", recordID: newID)
                 nameRecord.setValue("Created by someone who is not the owner", forKey: "title")
                nameRecord.parent = CKRecord.Reference(record:records![0], action: .none)


                 CKContainer.default().sharedCloudDatabase.save(nameRecord) { (savedRecord: CKRecord?, error: Error?) -> Void in
                    print(error)

                }
            }
         }