Как получить уведомление, если владелец удаляет меня из CKShare на CloudKit - PullRequest
0 голосов
/ 13 октября 2018

Допустим, владелец записи делится этим со мной.Мне отправляют ссылку на общий ресурс, и я открываю ее и принимаю эту акцию следующим образом:

let operation = CKAcceptSharesOperation(shareMetadatas: [metadata])
operation.acceptSharesCompletionBlock = { error in
  if let error = error{
    print("accept share error: \(error)")
  }else{
    //Share accepted...
  }
}
CloudKit.container.add(operation)

Я также ранее подписан на базу данных Shared , например, так:

let subscriptionSharedDatabase = CKDatabaseSubscription(subscriptionID: "subscriptionSharedDatabase")
let sharedInfo = CKSubscription.NotificationInfo()
sharedInfo.shouldSendContentAvailable = true
sharedInfo.alertBody = "" //This needs to be set or pushes don't get sent
subscriptionSharedDatabase.notificationInfo = sharedInfo

let subShared = CKModifySubscriptionsOperation(subscriptionsToSave: [subscriptionSharedDatabase], subscriptionIDsToDelete: nil)
CloudKit.sharedDB.add(subShared)

Но теперь допустим, что владелец CKShare удаляет меня как участника для этой записи и сохраняет обновленный список участников в CloudKit.

Насколько я могу судить, только уведомление, которое я получаю, является другим изменением подписки на общую базу данных (subscriptionSharedDatabase), но никакие записи не изменяются или удаляются (я смотрел, и нет никаких измененных записей, когда я их получаю).

Насколько я знаю, единственный способ получать уведомления об изменениях участников в CKShare - это подписаться на уведомления о типе записи cloudkit.share, но это не доступно мне в общей базе данных,верно?

Как я могу получить уведомление, когда меня удаляют из CKShare?

1 Ответ

0 голосов
/ 28 марта 2019

Интересно, как на это нет ответов.Я только что реализовал некоторый код, связанный с CKShare, и он, кажется, работает довольно предсказуемо.Вот базовый подход.

1) при запуске моего приложения я делаю CKFetchRecordZonesOperation.fetchAllRecordZonesOperation() в общей базе данных, чтобы получить все текущие зоны записи, которые мне доступны.

2) Я настроил CKDatabaseSubscription в общей базе данных, как вы предлагаете.

3) Получив это уведомление в общей базе данных, я делаю пакет CKFetchRecordZoneChangesOperation во всех зонах общих записей.(Вы можете передать несколько зон записи вместе с токеном изменения сервера для каждой зоны, чтобы выполнить запрос массовых обновлений.)

4) Если какие-либо общие ресурсы не были разделены, но сами зоны записи по-прежнему действительны, яобратите внимание, что recordWithIDWasDeletedBlock запускается дважды, один раз с неразделенным CKRecord и один раз с соответствующим CKShare.

5) (я еще не полностью выяснил эту часть), если доля былапоследний для данного пользователя, вся общая зона записи этого пользователя удаляется из моей общей базы данных.Я еще не совсем понял, как лучше всего справиться с этой частью.Я мог бы запрашивать новые зоны записи каждый раз, когда получаю CKDatabaseNotification, но это кажется расточительным.Я вижу, что могу запустить операцию CKFetchDatabaseChanges, которая информирует меня об измененных зонах, но мне еще предстоит выяснить, когда лучше всего ее запускать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...