Представление контроллера общего доступа 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 ...
Что я делаю не так?