如何找出 CloudKit 订阅何时被删除?

Posted

技术标签:

【中文标题】如何找出 CloudKit 订阅何时被删除?【英文标题】:How to find out when a CloudKit Subscription is deleted? 【发布时间】:2019-04-18 07:32:53 【问题描述】:

我在我的 ios 应用程序中使用 CloudKit。

在我的应用程序中,每当用户修改某些数据时,我都会更新 CloudKit 私有数据库,以便用户的其他设备也可以更新。

用户可以启用/禁用此同步机制。

当用户启用同步时,我创建订阅并将本地数据推送到 CloudKit。

如果用户已登录到其他设备,他们会按预期开始收到有关私有数据库更改的远程通知。

应用程序显示UISwitch 供用户启用/禁用同步。

假设用户有 2 个设备 DeviceADeviceB,这表明通过将 UISwitch.isOn 设置为 true 已启用同步。

如果用户在 DeviceA 上禁用同步,则订阅将被删除,并且在 DeviceA 上所做的更改不会像预期的那样触发对DeviceB 的远程通知。

DeviceB 仍然显示同步已启用。

有没有办法知道订阅何时被删除?

我知道CKFetchSubscriptionsOperation。我可以定期致电CKFetchSubscriptionsOperation 了解订阅情况。有没有更好的方法呢?

【问题讨论】:

【参考方案1】:

这是一个很好的问题,我也遇到过。你是对的。了解订阅状态的唯一方法是查询CKFetchSubscriptionsOperation 的可用内容。

一种可能的解决方法是创建一个名为 Subscription 之类的 recordType 并将用户当前使用的 subscriptionIDs 保存为 常规 CloudKit 记录(只需使用 String 属性在CKRecord)。

然后,当他们在设备上取消订阅时,您可以更新 Subscription 记录,他们的所有设备都会收到更改通知。然后,该应用将根据用户可用的subscriptionIDs 更新实际订阅。

所以这是一个潜在的工作流程:

    DeviceA 退订 subscription1DeviceASubscription 表中删除subscriptionRecord1DeviceA 使用CKModifySubscriptionsOperation() 删除实际的subscription1 订阅。 DeviceB 收到通知,subscriptionRecord1 已被删除,并将同步 UISwitch 关闭(我假设您正在使用数据库或 UserDefaults 等本地持久性方法保存这些开关的状态)。

希望这会有所帮助。如果您有任何问题,请告诉我。

【讨论】:

以上是关于如何找出 CloudKit 订阅何时被删除?的主要内容,如果未能解决你的问题,请参考以下文章

部署到生产:为啥 CloudKit 删除订阅类型?

CKReference 的 CloudKit 订阅通知未按预期工作

swift Swift - CloudKit - 删除订阅

如何删除/更新异步方式以及何时取消订阅?

tvOS 中的 CloudKit 订阅

Cloudkit 新记录通知