Нужно ли мне извлекать изменения CloudKit и подписки? - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь реализовать подписки CloudKit. Ранее я просто выбирал из пользовательской зоны, используя CKServerChangeToken, когда мое приложение запускается и в ключевых точках моего приложения.

Моя установка использует только личную базу данных.

Мне просто интересно, нужно ли мне делать этот тип выборки, если я перейду к использованию подписок? Из документации, которую я видел, не ясно.

Вместо того чтобы использовать запрос на подписку, я использую CKSubscriptionOptionsFiresOnRecordUpdate и зацикливаю все типы моих записей для регистрации уведомлений.

1 Ответ

0 голосов
/ 08 сентября 2018

Да, вам все равно нужно использовать CKServerChangeToken, даже если вы реализуете CKQuerySubscription. Вот как типичное (из того, что я видел) приложение CloudKit поддерживает синхронизацию данных:

  1. Загрузка при запуске - Когда приложение снова запускается или становится активным, проверьте CKServerChangeToken и получите все новые данные.
  2. Извлечение из уведомлений - Обновление записей из фоновых (т.е. беззвучных) push-уведомлений по мере их поступления из вашей записи CKQuerySubscription s, чтобы ваши данные были свежими.

Apple описывает уведомления как «лучшее усилие», что означает, что иногда они не приходят (и, поверьте мне, иногда нет). Поэтому я считаю полезным периодически получать новые изменения (например, каждые несколько минут) на тот случай, если мое приложение пропустит уведомление об изменении.

Вот пример кода регистрации всех изменений типа записи Task:

let subscription = CKQuerySubscription(recordType: "Task", predicate: NSPredicate(value: true), subscriptionID: "subscriptionTask", options: [.firesOnRecordCreation, .firesOnRecordUpdate, .firesOnRecordDeletion])

let info = CKNotificationInfo()
info.shouldSendContentAvailable = true
info.alertBody = "" //This needs to be set to improve notification priority
subscription.notificationInfo = info

let operation = CKModifySubscriptionsOperation(subscriptionsToSave: [subscription], subscriptionIDsToDelete: nil)
operation.modifySubscriptionsCompletionBlock = { subscriptions, subscriptionIDs, error in
  //...
}

let container = CKContainer(identifier: "...")
container.privateCloudDatabase.add(operation)

Надеюсь, это поможет.

...