CloudKit - обмен записями с UICloudSharingController приводит к нескольким ошибкам - PullRequest
0 голосов
/ 20 сентября 2019

Представление контроллера общего доступа Cloud после нажатия кнопки панели:

@IBAction func inviteMemberAction(_ sender: Any) {

    let zoneID = CKRecordZone.ID(zoneName: "MyCustomZone", ownerName: CKCurrentUserDefaultName)
    let recordID: CKRecord.ID = CKRecord.ID(recordName: self.team!.recordName!, zoneID: zoneID)
    let recordToShare: CKRecord? = CKRecord(recordType: "Team", recordID: recordID)

    guard let barButtonItem = sender as? UIBarButtonItem, let rootRecord = recordToShare else {
        print("nope not ready to share!")
        return
    }

    let cloudSharingController = UICloudSharingController { [weak self] (controller, completion: @escaping (CKShare?, CKContainer?, Error?) -> Void) in
        guard let `self` = self else {
            return
        }
        self.share(rootRecord: rootRecord, completion: completion)
    }

    // Allow only the invited participants and read/write permission options.
    //cloudSharingController.availablePermissions = [.allowPrivate, .allowReadWrite]

    cloudSharingController.delegate = self

    if let popover = cloudSharingController.popoverPresentationController {
        popover.barButtonItem = barButtonItem
    }
    self.present(cloudSharingController, animated: true) {}
}

Функция общего доступа:

private func share(rootRecord: CKRecord, completion: @escaping (CKShare?, CKContainer?, Error?) -> Void) {
    let shareRecord = CKShare(rootRecord: rootRecord)

    let recordsToSave = [rootRecord, shareRecord];
    let container = CKContainer.default()
    let privateDatabase = container.privateCloudDatabase
    let operation = CKModifyRecordsOperation(recordsToSave: recordsToSave, recordIDsToDelete: [])

    operation.perRecordCompletionBlock = { (record, error) in
        if let error = error {
            print("CloudKit error details: \(error)")
        }
    }

    operation.modifyRecordsCompletionBlock = { (savedRecords, deletedRecordIDs, error) in
        if let error = error {
            completion(nil, nil, error)
        } else {
            completion(shareRecord, container, nil)
        }
    }

    privateDatabase.add(operation)
}

Это приводит к следующим ошибкам:

CKError 0x600000150a80: «Сбой пакетного запроса» (22/2024);«Запись не будет сохранена из-за предыдущей ошибки в атомарной зоне»>

CKError 0x600000121920: «Запись сервера изменена» (14/2004);сообщение сервера = «запись для вставки уже существует»;uuid = ABA07A9D-754E-4D4D-811E-63598364C76A;идентификатор контейнера = "iCloud.com.company.name">

CKError 0x60000015d710: «Частичная ошибка» (2/1011);"Не удалось изменить некоторые записи";uuid = ABA07A9D-754E-4D4D-811E-63598364C76A;идентификатор контейнера = "iCloud.com.company.name";частичные ошибки: {4D618825-8D87-88D8-A217-3B24D41114B0: (MyCustomZone: defaultOwner ) = ... 1 «Сбой пакетного запроса» CKError пропущено ...}

Если я добавлю следующую строку кода в функцию общего доступа

operation.savePolicy = .allKeys

Процесс совместного использования не выдаст ошибок, и я смогу продолжить делиться записью по почте, URL-адресу и т. Д. В UICloudSharingController, поэтому кажется,работать, но ничего не передается.В инструментальной панели de CloudKit я вижу, что rootRecord обновляется строкой shortGuide, а запись связана с записью общего ресурса (типа cloudKit.share).Если я открываю связанную запись общего ресурса, на панели инструментов появляется всплывающее сообщение с предупреждением:

Возникла проблема с решением краткого руководства.BadRequestException: отсутствует обязательное поле 'значение'.Идентификатор запроса: 2903 ...

Что я делаю не так?

...