我是否需要增量提取 CloudKit 更改以及订阅?

Do I need to delta fetch CloudKit changes as well as subscriptions?

我正在尝试实现 CloudKit 订阅。以前我只是在我的应用程序启动时和在我的应用程序中的关键点使用 CKServerChangeToken 从自定义区域获取。

我的设置纯粹使用私有数据库。

我只是想知道如果我转为使用订阅,是否还需要进行这种类型的提取?从我看到的文档看不清楚。

我没有使用订阅查询,而是使用 CKSubscriptionOptionsFiresOnRecordUpdate 循环遍历我的所有记录类型来注册通知。

是的,即使您实现了 CKQuerySubscription,您仍然需要使用 CKServerChangeToken。这是一个典型的(据我所见)CloudKit 应用程序如何保持其数据同步:

  1. 启动时获取 - 当应用程序启动或再次激活时,检查您的CKServerChangeToken并获取任何新数据。
  2. 从通知中获取 - 在后台(即静默)推送通知从您的记录 CKQuerySubscription 中更新记录,以便您的数据新鲜。

Apple 将通知描述为 "best effort",这意味着有时它们不会到达(相信我,有时它们不会到达)。因此,我发现定期获取新更改(比如每隔几分钟)很有用,以防我的应用错过更改通知。

下面是一些示例代码,说明如何注册对 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)

希望对您有所帮助。