CloudKit:使用通知使更改在多个设备之间保持同步

Posted

技术标签:

【中文标题】CloudKit:使用通知使更改在多个设备之间保持同步【英文标题】:CloudKit: Using notifications to keep changes in sync across multiple devices 【发布时间】:2015-12-03 20:07:35 【问题描述】:

我正在编写一个应用程序并使用 CloudKit。该应用程序将其数据存储在公共数据库中。我创建了一个本地缓存,这样即使网络不可用,我的应用程序也能正常运行。我正在使用CKSubscriptions 和由此产生的推送通知来保持来自云的更改同步。所有这一切都运作良好。

现在,如果用户有多个设备并在所有这些设备上运行我的应用程序,那么我不能再将通知标记为“已读”(使用 CKMarkNotificationsReadOperation),因为我不知道所有设备何时处理完毕他们。如果发生更改时其中一个设备处于脱机状态,则尤其如此。如果我确实将它们标记为已读,那么当其他设备检查新通知(使用CKFetchNotificationChangesOperation)时,它们将看不到它们,并且它们的本地缓存将过期。

我当前的解决方案是将所有通知保持在“未读”状态并依赖CKFetchNotificationChangesOperation 中的CKServerChangeToken,以便每个设备仅获取自该设备上次检查以来发生的通知。这很好用。

但是,在我看来,由于我没有将任何通知标记为“已读”,它们只会继续堆积在服务器上。也许这没什么大不了的,但它们会占用空间,我没有好办法摆脱它们。随着时间的推移,这似乎会成为一个问题。

有没有人以类似的方式使用订阅/通知并提出不同的方法?此外,欢迎对我的方法提出任何反馈。

【问题讨论】:

通知适用于每个设备。每个设备都应将收到的通知标记为已读。这不应影响其他设备的通知。 @rmaddy 我也有同样的想法,但这不是我所经历的。我刚刚用 3 台设备进行了测试。第一台设备在 WiFi 上,另外两台在飞行模式下——都登录到同一个 iCloud 帐户。我使用 iCloud Dashboard 做了 3 处更改。第一个设备正确收到通知并更新其数据。它将通知标记为已读。我在第二台设备上关闭了飞行模式。它收到通知说之前的通知已被阅读:notificationType of ReadNotification,但没有收到更改通知。第三台设备是一样的。似乎不正确。还有其他想法吗? 【参考方案1】:

无论读取状态如何,服务器都会删除旧通知。

【讨论】:

谢谢,@乔尔。当我看到CKErrorChangeTokenExpired 中的CKError 时,我假设同样的事情,这让我相信通知必须在一段时间后被删除。感谢您的确认。 但是文档说如果令牌过期,则传递 nil 以获取所有先前的通知,这意味着令牌已从服务器中删除,而不是通知。 公共数据库的工作方式不同。此外,您不能依赖通知来同步您的数据,通知只是为了让您知道发生了什么事。

以上是关于CloudKit:使用通知使更改在多个设备之间保持同步的主要内容,如果未能解决你的问题,请参考以下文章

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

Swift CloudKit CoreData 远程更改通知也会触发本地更改

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

CloudKit 在记录创建时收到多个通知

注册以接收远程 CloudKit 更改的通知不起作用

iOS、CloudKit - 我的应用启动时是不是需要进行抓取?