CKServerChangeToken 的“范围”是什么?

veg*_*ker 5 ios cloudkit

https://developer.apple.com/reference/cloudkit/ckserverchangetoken中所述,CloudKit 服务器返回更改令牌作为 CKFetchRecordZoneChangesOperation 回调响应的一部分。对于哪组后续记录提取,我应该在提取调用中包含给定的更改标记?

  • 只提取到我们从中提取的区域?
  • 或者它是否适用于对该区域所在的数据库的任何提取?或者数据库所在的整个容器?
  • 应用扩展呢?(应用程序扩展具有与主应用程序相同的 iCloud 用户,但具有由 fetchUserRecordIDWithCompletionHandler: 返回的不同“用户”,至少在我的测试中)从主应用程序的 fetch 调用中提供更改令牌是否合适? ,比如说,一个消息应用程序扩展?我认为不是,但很想有一个记录在案的官方答案。

Nei*_*ith 6

我也发现范围CKServerChangeToken有点不清楚。然而,回顾文档,后两者CKFetchDatabaseChangesOperationCKFetchRecordZoneChangesOperation 提供和管理自己的服务器更改令牌。

如果您决定在获取更改(大约 8 分钟标记)时遵循 Dave Browning 在他2017 年 WWDC 演讲中概述的 CloudKit 工作流程,这将特别有用。

推荐的方法是:

1) 使用CKFetchDatabaseChangesOperation. 通过 接收到更新的令牌后changeTokenUpdatedBlock,将其保留在本地。此令牌的“范围”限定CKDatabase为操作添加到的私有或共享。公共数据库不提供更改令牌。

2) 如果您recordZoneWithIDChangedBlock在之前的操作中通过 接收到区域 ID ,这表明您可以使用 获取更改的区域CKFetchRecordZoneChangesOperation。此操作通过相当繁琐的初始化参数接收它自己唯一的服务器更改令牌:CKFetchRecordZoneChangesOperation.ZoneConfiguration。这是针对此特定CKRecordZone. 因此,同样,当通过 接收更新的令牌时recordZoneChangeTokensUpdatedBlock,它需要在本地持久化(可能使用与其相关的密钥CKRecordZone.ID)。

这里的好处是它可能最大限度地减少了网络调用的数量。如果数据库未报告任何已更改的区域 ID,则首先获取数据库更改可防止对每个记录区域进行调用。

这是CloudKit 团队的一个代码示例,它贯穿了这个工作流程。不可否认,一些 API 已经更改,并且注释没有明确说明服务器更改令牌的“范围”。