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
错误:
- 获取更改并保存您的更改 token 。
- 在仪表板中,删除您正在同步的区域。
- 创建一个同名的新区域。
- 在您的代码中,使用第 1 步中的更改 token 再次获取更改。
由于 token 指向不同的区域,它对 CloudKit 没有任何意义,它会返回一个 .changeTokenExpired
错误。
关于ios - 通过生成已知过期的 CKServerChangeToken 来测试 CKErrorChangeTokenExpired 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41524503/