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

时间:2018-09-05 20:57:12

标签: ios cocoa-touch cloudkit cksubscription

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

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

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

我不是使用订阅查询,而是使用CKSubscriptionOptionsFiresOnRecordUpdate并循环访问所有记录类型来注册通知。

1 个答案:

答案 0 :(得分:1)

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

  1. 启动时获取-当应用启动或再次启用时,请检查您的CKServerChangeToken并获取所有新数据。
  2. 从通知中获取-从记录CKQuerySubscription进入时,从后台(即无声)推送通知中更新记录,以使您的数据保持最新状态。

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)

我希望有帮助。