CloudKit - при совместном использовании записей с UICloudSharingController возникает несколько ошибок.
Представление контроллера общего доступа к облаку после нажатия кнопки на панели:
@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); server message = "запись для вставки уже существует"; uuid = ABA07A9D-754E-4D4D-811E-63598364C76A; ID контейнера = "iCloud.com.company.name">
CKError 0x60000015d710: "Частичный отказ" (2/1011); "Не удалось изменить некоторые записи"; uuid = ABA07A9D-754E-4D4D-811E-63598364C76A; ID контейнера = "iCloud.com.company.name"; частичные ошибки: {4D618825-8D87-88D8-A217-3B24D41114B0:(MyCustomZone:defaultOwner) =... 1 "Batch Request Failed" CKError's опущено... }
Если я добавлю следующую строку кода в функцию совместного использования
operation.savePolicy = .allKeys
Процесс совместного использования не дает ошибок, и я могу продолжать делиться записью по почте, URL-адресу и т. Д. В UICloudSharingController, поэтому кажется, что он работает, но ничего не передается. На панели управления CloudKit я вижу, что rootRecord обновляется строкой shortGuide, а запись связана с общей записью (типа cloudKit.share). Если я открою связанную запись общего ресурса, на панели управления появится всплывающее сообщение с предупреждением:
Не удалось разрешить краткое руководство. BadRequestException: отсутствует обязательное поле "значение". ID запроса: 2903...
Что я делаю неправильно?