如何解决设备之间的 CloudKit 功能不一致

Posted

技术标签:

【中文标题】如何解决设备之间的 CloudKit 功能不一致【英文标题】:How to resolve CloudKit functionality inconsistency between devices 【发布时间】:2015-12-14 16:51:08 【问题描述】:

我已将 CloudKit 集成到我的 ios 应用程序中,但我遇到了设备之间的功能不一致问题。

我的一位用户拥有 iPod 5th Gen 和 iPhone 6。如果他们使用 iPod,一切都会按预期工作。但是,如果他们使用 iPhone 6,他们只能接收数据和通知,他们不能自己进行更改。当 iPhone 尝试对 iCloud 公共数据库进行更改时,我没有收到任何错误,并且更改是在本地进行的,它们只是永远不会到达服务器(一切似乎都正常,但实际上没有)。

鉴于用户可以成功使用 iPod,但同一个 iCloud 帐户仅在 iPhone 上接收数据,这表明这可能是权限或设置问题。

我已经检查过:

用户已登录 iCloud iCloud 驱动器已打开 应用在设置中的 iCloud Drive 菜单中显示为已启用 应用在“通过电子邮件查找我”菜单下显示为已启用

其他细节:

该应用可通过 TestFlight 获得 应用正在使用生产容器(TestFlight 需要)

我不知道要提供什么代码,因为该应用程序在其他设备上按预期运行,但请告诉我有什么帮助。任何帮助将不胜感激。

【问题讨论】:

我假设 iPhone 可以看到 iPod 所做的更改? “在本地进行更改”是指 iPhone 可以从公共数据库中获取刚刚进行的更改吗?您在 iCloud 仪表板中看到这些记录了吗?您如何获取这些记录 - 使用查询操作或通过记录 ID 获取?记录在被索引时可能有一段时间不会出现在其他客户端的查询中,但它们始终可以通过记录 ID 获取。 iPhone 可以看到变化。我的 CKModifyRecordsOperation 方法的完成处理程序在成功时将更改保存到本地数据模型。在 iPhone 上创建的更改和记录不会出现在 iCloud 仪表板中。我根据上下文同时使用查询操作和单个记录提取。 iPhone 没有获取记录的问题,我只有创建或修改记录的问题。令我困惑的部分是我的修改操作不返回任何错误并执行完成处理程序,就好像它们成功了一样。只是不会对 iCloud 服务器进行更改。感谢您的宝贵时间。 很奇怪,来自手机的更改没有显示在公共数据库中。您确定在 perRecordCompletionBlock 或 modifyRecordsCompletionBlock 中没有收到错误消息吗? iPhone有没有越狱的可能? 另外,如果您可以在记录保存发生时从该用户的 iPhone 获取控制台日志,它可能对正在发生的事情有所了解。 不,没有错误。我的错误显示为用于测试的 uialertviews,即使它们被正确处理,我也会显示警报视图并将其记录下来以作记录。手机没有越狱。我会继续测试,看看我是否遗漏了什么,但我很困惑。我实际上已经审查了你们中的一些其他与 cloudkit 相关的答案,我将尝试其中的一些想法。我将查看 qualityOfService 并查看我的完成处理程序,我可能会在那里出错。再次感谢。 【参考方案1】:

这已通过将我的修改操作 qualityOfService 属性更改为 .UserInitiated 来解决。

在我查看了我的 CKModifyRecordsOperation 的完成处理程序后,我意识到我正在保存本地功能所需的数据,而不管完成处理程序是否收到错误(顺便说一句,它是否已执行)。因此,当我发现我的操作正在运行并且没有返回任何错误时,它实际上根本没有运行。更改 qualityOfService 似乎已经解决了这个问题。

Answer that led to the solution

【讨论】:

以上是关于如何解决设备之间的 CloudKit 功能不一致的主要内容,如果未能解决你的问题,请参考以下文章

CloudKit 如何与多个设备同步?

Cloudkit 与组合

Cloudkit 为每个用户提供不同的记录类型?

UICloudSharingController 不显示/不与 CloudKit 应用程序一起使用

如何通知另一台设备 CloudKit 记录已更新?

如何在 Swift 中将 Core Data 与 Cloudkit 和许多设备同步