【问题标题】:Testing CKErrorChangeTokenExpired handling by generating known expired CKServerChangeToken通过生成已知过期的 CKServerChangeToken 测试 CKErrorChangeTokenExpired 处理
【发布时间】:2017-01-07 17:45:39
【问题描述】:

CKFetchDatabaseChangesOperationfetchDatabaseChangesCompletionBlock 的标题评论指出:

"如果服务器返回一个CKErrorChangeTokenExpired 错误,previousServerChangeToken 值太旧,客户端应该扔掉它的本地缓存和 以 nil previousServerChangeToken 开头重新获取此记录区域中的更改。"

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

我从私有头中添加了一个 init 方法:

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

并使用如下:

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

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

【问题讨论】:

    标签: ios objective-c cloudkit


    【解决方案1】:

    这是一篇旧帖子,但我这样做无意中产生了.changeTokenExpired 错误:

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

    由于令牌指向不同的区域,因此对 CloudKit 没有任何意义,它会返回 .changeTokenExpired 错误。

    【讨论】:

      【解决方案2】:

      如果 Apple 提供了一种方法来做到这一点,那就太好了,因为这是一个绝对关键的测试情况。

      我找不到任何推荐的方法来执行此操作,因此我使用了为其他区域生成的令牌。如果您像我一样拥有多个区域,则可以有效地跨线令牌检索。这不是一个优雅的解决方案,但它确实有效...... :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-09
        • 1970-01-01
        • 2012-01-13
        相关资源
        最近更新 更多