CKShare - Не удалось изменить некоторые записи, ошибка - CloudKit

Я пытаюсь поделиться записью с другими пользователями в CloudKitно я продолжаю получать ошибку. Когда я нажимаю на один из элементов / записей на столе, я получаюUICloudSharingController и я вижу iMessage значок приложения, но когда я нажимаю на него, я получаю сообщение об ошибке и UICloudSharingController исчезает, самое забавное, что даже после ошибки я все еще могу продолжать использовать приложение.

Вот что у меня есть.

Код

var items = [CKRecord]()
var itemName: String?

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let item = items[indexPath.row]

    let share = CKShare(rootRecord: item)

    if let itemName = item.object(forKey: "name") as? String {
        self.itemName = item.object(forKey: "name") as? String
        share[CKShareTitleKey] = "Sharing \(itemName)" as CKRecordValue?
    } else {
        share[CKShareTitleKey] = "" as CKRecordValue?
        self.itemName = "item"
    }
    share[CKShareTypeKey] = "bundle.Identifier.Here" as CKRecordValue
    prepareToShare(share: share, record: item)
}


private func prepareToShare(share: CKShare, record: CKRecord){

    let sharingViewController = UICloudSharingController(preparationHandler: {(UICloudSharingController, handler: @escaping (CKShare?, CKContainer?, Error?) -> Void) in

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

        modRecordsList.modifyRecordsCompletionBlock = {
            (record, recordID, error) in

            handler(share, CKContainer.default(), error)
        }
        CKContainer.default().privateCloudDatabase.add(modRecordsList)
    })

    sharingViewController.delegate = self

    sharingViewController.availablePermissions = [.allowPrivate]
    self.navigationController?.present(sharingViewController, animated:true, completion:nil)
}



// Delegate Methods:
func cloudSharingControllerDidSaveShare(_ csc: UICloudSharingController) {
    print("saved successfully")
}
func cloudSharingController(_ csc: UICloudSharingController, failedToSaveShareWithError error: Error) {
    print("failed to save: \(error.localizedDescription)")// the error is generated in this method
}
func itemThumbnailData(for csc: UICloudSharingController) -> Data? {
    return nil //You can set a hero image in your share sheet. Nil uses the default.
}
func itemTitle(for csc: UICloudSharingController) -> String? {
    return self.itemName
}

ОШИБКА

Не удалось изменить некоторые записи

Вот что я вижу...

Есть идеи, что может быть не так?

РЕДАКТИРОВАТЬ:

Кстати, ошибка генерируется в cloudSharingController failedToSaveShareWithError метод.

3 ответа

Решение

Похоже, вы пытаетесь поделиться в зоне по умолчанию, что запрещено. Из документации здесь

Совместное использование поддерживается только в зонах с возможностью CKRecordZoneCapabilitySharing. Зона по умолчанию не поддерживает совместное использование.

Поэтому вам следует создать настраиваемую зону в своей частной базе данных и сохранить там свою долю и записи.

Возможно, это связано с тем, как вы пытаетесь создать экземпляр UICloudSharingController? Я скопировал прямо из документации, и он работает:

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)
}

Если проблема не в этом, то проблема в одной или обеих записях. Если вы загрузите запись, не пытаясь поделиться ею, это сработает?

ИЗМЕНИТЬ ДОБАВИТЬ:

Что такое CKShareTypeKey? Я не использую это в своем приложении. Также я установил свои системные поля иначе:

share?[CKShare.SystemFieldKey.title] = "Something"

Попробуйте добавить это в свой info.plist

<key>CKSharingSupported</key>
<true/>
Другие вопросы по тегам