Да, вам все равно нужно использовать CKServerChangeToken
, даже если вы реализуете CKQuerySubscription
. Вот как типичное (из того, что я видел) приложение CloudKit поддерживает синхронизацию данных:
- Загрузка при запуске - Когда приложение снова запускается или становится активным, проверьте
CKServerChangeToken
и получите все новые данные.
- Извлечение из уведомлений - Обновление записей из фоновых (т.е. беззвучных) 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)
Надеюсь, это поможет.