努力理解 CloudKit 中的 CKSubscriptions

Posted

技术标签:

【中文标题】努力理解 CloudKit 中的 CKSubscriptions【英文标题】:Struggling to Understand CKSubscriptions in CloudKit 【发布时间】:2015-05-07 00:03:40 【问题描述】:

几周以来,我一直在阅读并尝试使用 CKSubscription 功能,但我找不到有关一些一般性问题的信息。我已经阅读了 Apple 文档、在线教程、我购买的书籍以及关于 SO 的问题,但我仍然不了解我认为的基本原理。很感谢任何形式的帮助。

以下是我找不到答案的问题:

1)。订阅 ID 的用途是什么?便利的init不包含它,那为什么在指定的init中需要它呢?如果你使用它,它对应用程序的所有用户都是一样的吗?

2)。我在这里看到有人提到您可以取消注册订阅 ID。您为什么或如何这样做?

3)。是否可以在公共或用户的私有数据库中设置订阅?

4)。如果我有一个对所有用户都相同的基于查询的订阅,那么数据库中是否只会列出 1 个订阅?

例如,我无法让通知与我的 具体用例。这在我的设置中不是问题,因为我可以让 True 谓词起作用并且通知来了。所以我一定不明白订阅如何运作的基本原理。

我正在尝试设置一个订阅,该订阅会在其他用户对帖子发表评论时在创建新记录时触发。然后,此新记录将包含对创建帖子的用户的引用。我在数据库中看到的两个用户的唯一订阅是 - Notifications.user(等于参考)。所以,我假设我只会看到这个订阅。(?)但是服务器如何跟踪每个用户的 recordID 或知道何时将其发送到特定设备?

问题是我无法让通知正常工作。我在仪表板中手动添加了一条记录,并将其他用户的记录 ID 作为 CKReference。当我添加记录时,我让应用程序在后台运行在用户帐户下的设备上,我将其添加为字段中的 CKReference。我希望查询能够触发并发送推送通知,因为有人对此用户的帖子发表了评论。

这是我设置订阅的代码:

func subscribe(userID: CKRecordID) 


    let options = CKSubscriptionOptions.FiresOnRecordCreation

    let userRef = CKReference(recordID: userID, action: .DeleteSelf)
    let predicate = NSPredicate(format: "userRef == %@", userRef)
    let predicateTwo = NSPredicate(format: "read = %@", "")
    let compoundPred = NSCompoundPredicate(type: .AndPredicateType, subpredicates: [predicate, predicateTwo])

    let subscription = CKSubscription(recordType: "Notifications", predicate: compoundPred, subscriptionID: subscriptionID,
        options: options)
    subscription.notificationInfo = CKNotificationInfo()
    subscription.notificationInfo.desiredKeys = ["userPost"]
    subscription.notificationInfo.alertBody = "Someone replied to your Pod post"

    publicDB.saveSubscription(subscription, completionHandler: 

        subscription, error in

        if (error != nil) 

            println("error subscribing: \(error)")

         else 

            println("subscribed!")

        

    )

【问题讨论】:

【参考方案1】:

让我试着回答一下:

    SubscriptionId 允许您稍后识别订阅,例如使用 CKDatabase 方法 deleteSubscriptionWithID 删除它 如何查看答案 1。至于为什么,也许您不想再收到有关此订阅的通知。这取决于您要通过应用实现的目标。 是的 是的,如果您只注册一个订阅,它应该适用于您应用的所有用户

关于您的问题,请注意用户记录 ID 是特殊的,因此您可能会遇到与这些问题特别相关的问题,因为它们周围的隐私问题。我建议尝试一个不涉及用户的简单案例,看看订阅是否适合您。然后再考虑如何使用用户记录 ID

【讨论】:

谢谢@harryhorn。我能够获得一个简单的真实谓词来工作并收到推送通知。此外,我可以在我的应用程序中为用户的 recordID 执行类似的谓词,例如当我想提取当前用户的帖子时。而且我的订阅谓词基本相同,所以想知道是否有一些关于引用和订阅的东西不起作用......虽然我看到其他人对 SO 的引用做了类似的事情,但无法判断是否是用户记录 ID .而且我找不到任何其他人做我正在做的订阅的例子。感谢您的帮助。 请解释一下您对参考文献的具体操作以及您要订阅的内容,以便我可以尝试提供帮助。 谢谢@harryhorn。当用户对另一个用户的帖子发表评论时,我会创建两条新记录——一条评论和一条通知记录。在通知记录中,我有三个字段,一个是对创建帖子的用户的引用,一个是对帖子的引用,另一个是将其标记为已读(在应用程序的通知部分内)。我想要一个查询订阅,让我在创建这些通知记录之一(有人回复他们的帖子)以及尚未标记为已读时向用户发送推送通知。将我的代码粘贴在上面,向您展示我现在是如何做到的。 似乎问题出在此代码上:let userRef = CKReference(recordID: userID, action: .DeleteSelf) let predicate = NSPredicate(format: "userRef == %@", userRef) 您将谓词绑定到特定用户引用的位置。这对我来说似乎是错误的。你确定这是需要的吗?也许您应该收到通知,然后在客户端决定通知是否有趣?另一种选择是更改谓词以测试 ID(如 userID),而不是与引用对象进行比较。 嗨@harryhorn。我一直在使用谓词来引用用户进行其他查询并且它有效。我获取用户的 recordID 并将其存储在 NSUserDefaults 中,然后通过对它们的引用查询用户发布的任何帖子/cmets。对于推送通知,只有在有人回复他们的帖子时才对当前用户有意义。否则他们会收到所有用户帖子的通知。我尝试了类似于您建议的方法,将字段更改为带有用户 ID 的字符串,但订阅失败。感谢您尝试提供帮助!我很茫然。

以上是关于努力理解 CloudKit 中的 CKSubscriptions的主要内容,如果未能解决你的问题,请参考以下文章

Swift / Cloudkit 谓词格式

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

CloudKit Dashboard 显示推送日志,但是收不到,为啥?

CloudKit 分享

cloudKit:公共数据库中的 CKFetchRecordChangesOperation

我正在努力理解着色器中的某些内容