ios - 通过生成已知过期的 CKServerChangeToken 来测试 CKErrorChangeTokenExpired 处理

标签 ios objective-c cloudkit

CKFetchDatabaseChangesOperation fetchDatabaseChangesCompletionBlock 的标题注释指出:

“如果服务器返回一个 CKErrorChangeTokenExpired 错误,则 previousServerChangeToken 值太旧,客户端应该丢弃其本地缓存并 从 nil previousServerChangeToken 开始重新获取此记录区域中的更改。”

我想测试这个场景,因此我想生成一个过期的 CKServerChangeToken,这样我就可以将它设置为 CKFetchDatabaseChangesOperation 上的 previousServerChangeToken >.

我从私有(private) header 添加了一个初始化方法:

@interface CKServerChangeToken (Private)
    - (id)initWithData:(NSData *)data;
@end

并按如下方式使用:

CKServerChangeToken knownExpiredToken = [[CKServerChangeToken alloc] initWithData:[[NSData alloc] initWithBase64EncodedString:@"AQAAAVl57tUGHv6sgNT9EeaTcQCM+sDHHA==" options:0]];

该字符串是从请求返回的有效更改 token ,我尝试修改它但未成功,例如减少我看到递增到较低的数字。然而,我设法得到另一个奇怪的无效参数错误,比如缺少连续标记。如果 CloudKit 工程师有任何建议,我将不胜感激,谢谢。

最佳答案

这是一篇旧文章,但我这样做无意中生成了 .changeTokenExpired 错误:

  1. 获取更改并保存您的更改 token 。
  2. 在仪表板中,删除您正在同步的区域。
  3. 创建一个同名的新区域。
  4. 在您的代码中,使用第 1 步中的更改 token 再次获取更改。

由于 token 指向不同的区域,它对 CloudKit 没有任何意义,它会返回一个 .changeTokenExpired 错误。

关于ios - 通过生成已知过期的 CKServerChangeToken 来测试 CKErrorChangeTokenExpired 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41524503/

相关文章:

ios - 访问另一个应用程序的 CloudKit 数据库?

ios - 带有自定义初始化程序的 UITableViewCell dequeueReusableCellWithIdentifier

objective-c - Storyboard元素在设备上的大小不正确

ios - 如何以编程方式快速切换到暗模式

ios - UITextField 占位符文本覆盖问题

iphone - 如何在任何设备的 UIView 中间水平和垂直放置一个按钮?

ios - 无法使用 CloudKit 获取共享云数据库自定义区域中的记录

ios - Swift - 应用程序跟踪透明度 - 由于 ‘Allow Apps to Request to Track’ 变灰而没有显示弹出窗口

ios - 如何在 objective-c 中创建 json

swift - 如何向 CloudKit 中的现有记录添加字段