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/>