CloudKit CKError“无效参数”和“错误同步延续数据”

Posted

技术标签:

【中文标题】CloudKit CKError“无效参数”和“错误同步延续数据”【英文标题】:CloudKit CKError "Invalid Arguments" with "Bad sync continuation data" 【发布时间】:2017-06-17 21:38:01 【问题描述】:

我正在使用 ios 10 开发 Xcode 8.3,我遵循 Apple 的 Cloud Kit Quick Start 文档来维护云数据的本地缓存,并且当私有数据库区域中的数据发生更改时,我的设备能够接收推送通知,但是在尝试获取区域更改时,我总是会收到以下错误:

2017-06-17 11:58:11.376807-0400 MyApp[10694:5029263] received remote notification
2017-06-17 11:58:11.897402-0400 MyApp[10694:5031532] fetch database change completed
2017-06-17 11:58:11.897606-0400 MyApp[10694:5031532] zone deletions
2017-06-17 11:58:12.320908-0400 MyApp[10694:5031561] record zone fetch completed
Error fetching zone changes for private database: <CKError 0x170256620: "Invalid Arguments" (12/2006); server message = "Bad sync continuation data"; uuid = xxxxxxxx-EFD7-459D-xxxx-xxxxxxxxxxx; container ID = "iCloud.com.mycompany.MyApp">
2017-06-17 11:58:12.332247-0400 MyApp[10694:5031561] fetch record zone changes completed
Error fetching zone changes for private database: <CKError 0x174640150: "Partial Failure" (2/1011); "Couldn't fetch some items when fetching changes"; uuid = xxxxxxxx-EFD7-459D-xxxx-xxxxxxxxxxx; container ID = "iCloud.com.mycompany.MyApp"; partial errors: 
PrivateZone:__defaultOwner__ = <CKError 0x170254670: "Invalid Arguments" (12/2006); server message = "Bad sync continuation data">
>

“Bad sync continuation data”非常令人困惑,因为我在 Apple 的文档中找不到对此错误的解释,也无法在 Google 搜索中找到任何参考。有没有人遇到过这种情况?

【问题讨论】:

【参考方案1】:

在更多地思考了“继续”在这种情况下的含义,并深入研究了 Apple 示例后,我意识到问题在于我只为在不同 fetch 更改阶段返回的服务器更改令牌保留了一个变量,如下所示fetchDatabaseChangesfetchZoneChanges 方法。添加变量以跟踪数据库更改令牌和区域更改令牌(每个区域都有自己的)后,“Bad sync continuation data”错误消失了,我可以看到从服务器返回的更改记录。

【讨论】:

我遇到了同样的问题。我是否正确理解每个数据库(私有、共享、公共)都有自己的更改令牌和每个区域(默认,...)?当我在 Apple 的示例代码中调整这些更改时,上述错误消失了,但是云守护程序崩溃了,我收到了这些错误消息:[LogFacilityCK] Got a connection error for operation B6D7CD06813D5F2E: Error Domain=NSCocoaErrorDomain Code=4097 "connection to service named com.apple.cloudd" UserInfo=NSDebugDescription=connection to service named com.apple.cloudd 也许您可以分享您调整后的示例代码? 嗨,@Daniel,是的,我从这个练习中了解到,每个数据库和区域都有自己的更改令牌。如果我在接收到由服务器端更改生成的远程通知后仅获取 fetchDatabaseChanges/fetchZoneChanges,我不会看到这些 LogFacilityCK 错误,但我玩过,如果我在接收任何通知之前主动获取更改,我确实会看到这些错误,比如我想获取在应用程序开始时更改。这也是你的代码中发生的事情吗?如果是这样,我想可能在服务器上没有任何新更改的情况下获取更改可能会导致一些 cloudKit 端错误。 为了确认这个错误是由于在服务器端没有任何更改的获取引起的,我尝试将我的应用程序置于后台,然后在服务器端进行一些更改,然后唤醒应用程序,这将触发 fetchChanges称呼。在这种情况下,应用程序成功地获取了更改而没有任何错误。再次进行此练习而不进行任何服务器端更改确实会再次导致 4097 错误。 有趣。我还没有收到通知。不知道为什么。 (我的应用程序在 macOS 中运行)我在启动时收到这些错误是因为这行:createZoneGroup.notify(queue: DispatchQueue.global()) if UserDefaults.standard.bool(forKey: "CreatedCustomZone") self.fetchChanges(in: .private) self.fetchChanges(in: .shared) 即使应用程序根本没有运行,我对仪表板上的一些记录进行了更改然后启动它,它会导致 4097 错误. 好的,我做错的一件事是我将记录保存到默认区域,但不支持从默认区域获取更改。现在我也收到了更改通知。但仍然是 4097 错误。我无法想象在服务器上没有任何新更改的情况下获取更改会导致错误,即使它看起来像那样。

以上是关于CloudKit CKError“无效参数”和“错误同步延续数据”的主要内容,如果未能解决你的问题,请参考以下文章

解析 CloudKit 错误 (CKError)

CloudKit 查询的奇怪错误

CKError:查询过滤器超出了值的限制:容器为 250

CloudKit“订阅重复”错误 - 获取 SubscriptionId

CKContainer requestApplicationPermission 中的服务不可用错误(CKError Code 6)

CloudKit,无法修改某些记录 - 未找到区域