如何创建 CloudKit 订阅通知以触发记录属性更新?
Posted
技术标签:
【中文标题】如何创建 CloudKit 订阅通知以触发记录属性更新?【英文标题】:How to create CloudKit subscription notification to fire on record attribute update? 【发布时间】:2016-09-25 17:02:03 【问题描述】:我使用 CloudKit。我有一个 Channel
记录类型,它确实有 isLive
作为属性。它可以是0
或1
,表示频道是否正在直播。
如果频道从 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 订阅通知以触发记录属性更新?的主要内容,如果未能解决你的问题,请参考以下文章