CloudKit 共享记录:如何让收到 link 的用户可以编辑它

CloudKit shared record: how to make it editable by the user who received the link

我尝试了所有方法,到处阅读,但我无法让收到 link

的用户可以编辑共享记录

除受邀用户执行的编辑外,一切正常

这是分享代码(如 WWDC16 视频):

    let sharingController = UICloudSharingController { (controller, preparationCompletionHandler) in

           let share = CKShare(rootRecord: record)
           share.publicPermission = .readWrite

           share[CKShareTitleKey] = "Help me to improve data" as CKRecordValue
           share[CKShareTypeKey] = "com.company.AppName" as CKRecordValue

           let modifyRecordsOperation = CKModifyRecordsOperation( recordsToSave: [record, share], recordIDsToDelete: nil)

           modifyRecordsOperation.modifyRecordsCompletionBlock = { (records, recordIDs, error) in
             if let errorK = error {
                 print(errorK.localizedDescription)
             }
            preparationCompletionHandler(share, CKContainer.default(), error)
           }
     CKContainer.default().privateCloudDatabase.add(modifyRecordsOperation)
                    }

sharingController.availablePermissions = [.allowPublic, .allowPrivate, .allowReadWrite]
sharingController.delegate = self

controller.present(sharingController, animated: true)

控制台总是打印:

PrivateDB can't be used to access another user's zone

谢谢

当您检索共享记录时,您需要将操作添加到共享数据库:

func fetchShare(_ metadata: CKShareMetadata) {
        debugPrint("fetchShare")

        let operation = CKFetchRecordsOperation(recordIDs: [metadata.rootRecordID])
        operation.perRecordCompletionBlock = { record, _, error in
            if let errore = error { debugPrint("Error fetch shared record \(errore.localizedDescription)") }

            if let recordOk = record {
                DispatchQueue.main.async() {

                    self.storage.append(recordOk)
                }
            }
        }
        operation.fetchRecordsCompletionBlock = { (recordsByRecordID, error) in
            if let errore = error { debugPrint("Error fetch shared record \(errore.localizedDescription)") }
        }
        CKContainer.default().sharedCloudDatabase.add(operation)
    }

但是现在尝试更新记录时出现问题,你需要知道谁是所有者,如果所有者是共享记录的人你需要保存到私有数据库,如果所有者是您需要保存到共享数据库的另一个人...所以:

func updateOrSaveRecord(_ record:CKRecord, update:Bool) {

        var db : CKDatabase

        if update == true {

            guard let creatorUserID = record.creatorUserRecordID else { return }

            if record.share != nil && creatorUserID.recordName != CKCurrentUserDefaultName {
                debugPrint("record shared from another user")
                db = CKContainer.default().sharedCloudDatabase
            } else {
                debugPrint("private record")
                db = CKContainer.default().privateCloudDatabase
            }
        } else { db = CKContainer.default().privateCloudDatabase }

        db.save(record) { (savedRecord, error) in

            if let errorTest = error {
                print(errorTest.localizedDescription)
            } else {
                if let recordOK = savedRecord {
                    DispatchQueue.main.async {
                        if update == false {
                            self.storage.append(recordOK)
                        } else {
                            self.dettCont?.updateScreen()
                        }
                        self.listCont?.tableView.reloadData()
                    }
                }
            }
        }
    }

要知道记录是否由当前用户创建,诀窍是与 CKCurrentUserDefaultName

进行比较