如何创建 CloudKit 订阅通知以触发记录属性更新?

Posted

技术标签:

【中文标题】如何创建 CloudKit 订阅通知以触发记录属性更新?【英文标题】:How to create CloudKit subscription notification to fire on record attribute update? 【发布时间】:2016-09-25 17:02:03 【问题描述】:

我使用 CloudKit。我有一个 Channel 记录类型,它确实有 isLive 作为属性。它可以是01,表示频道是否正在直播。

如果频道从 0 变为 1,我想在直播状态时向所有用户发送通知。

我尝试像这样定义 CKQuerySubscription:

    let liveSubscription = CKQuerySubscription(recordType: "Channel", predicate: NSPredicate(format: "(recordID == '4cebe441-c6f7-47af-85df-e6572e757c5c') AND (isLive == 1)"), options: [.firesOnRecordUpdate])
    let liveNotificationInfo = CKNotificationInfo()
    liveNotificationInfo.shouldSendContentAvailable = false
    liveNotificationInfo.shouldBadge = true
    liveNotificationInfo.alertBody = "Test is live now"
    channelSubscription.notificationInfo = liveNotificationInfo

这确实会发送有关此频道记录的任何更新的通知。它不关心isLive 谓词。

知道如何仅接收 isLive 从 0 变为 1 的通知吗?

或者最好接收此频道记录的所有更新,在我的应用程序中处理它们,然后在必要时发送本地通知?

【问题讨论】:

嗨,有什么解决方法吗?它也不适合我。 【参考方案1】:

不可能仅在一次属性更新时注册更改。当 ANY 的字段更新时,您将始终收到通知。这要好得多,而且总是这样工作。

【讨论】:

【参考方案2】:

两件事。首先,您应该发送对记录的引用,而不是原始的 recordName 字符串。其次,将.firesOnce 添加到订阅中,这样它只会触发一次。

            let reference = CKReference(recordID: recordID, action: .none)
            let predicate = NSPredicate(format: "%K == %@ && %K == %@",
                                        "isLive", 1,
                                        "recordID", reference)
            let liveSubscription = CKQuerySubscription(recordType: "Channel",
                                                       predicate: predicate,
                                                       options: [.firesOnRecordUpdate, .firesOnce])

【讨论】:

以上是关于如何创建 CloudKit 订阅通知以触发记录属性更新?的主要内容,如果未能解决你的问题,请参考以下文章

Cloudkit 新记录通知

未收到来自 CloudKit 订阅的推送通知

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

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

在 sharedDB cloudkit 中订阅记录更改

CloudKit,重新安装应用程序后,如何将我的订阅重置为当前记录状态?