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

时间:2015-04-22 01:14:54

标签: ios swift cloudkit cksubscription ckreference

我尝试为包含带有CKReference的字段的记录设置CKSubscription给用户。但是无论何时创建记录,它都会忽略compoundPredicate的这一部分,并且通知永远不会出现。在CKSubscription的谓词中使用CKReference有什么不同吗?我进入仪表板,在我自己的用户recordID下输入一条新记录(在模拟器中运行另一个用户),因为我相信我读过如果记录来自设备,它就不会收到通知。非常感谢任何见解,因为我已经坚持了一个星期,并且找不到任何特定于此的在线信息。我能够获得真正的类型谓词通知,所以我认为我的基本设置没问题。

在仪表板中,我看到两个测试用户都有一个通用订阅,但没有任何一个用户的特定记录ID(这有关系吗?):

Notifications.read (equals string)
Notifications.user (equals reference)

当我执行fetchAllSubscriptionsWithCompletionHandler方法时,它确实将此设备的当前用户的特定记录ID显示为调试器中的CKReference。所以我不知道为什么它不会工作。

这是我的代码,我首先创建CKReference,然后将它用于我的谓词:

var recordIDString = CKRecordID(recordName: "_a86dac8ee05f8c6ab35746bf9663d7b8")
// I normally store this string in the NSUserDefaults.

    let userRef = CKReference(recordID: recordIDString, action: .DeleteSelf)
     let predicate = NSPredicate(format: "user = %@", userRef)
   let predicateTwo = NSPredicate(format: "read = %@", "")
// I want the read field to be empty, which tells me user has not read my internal app notif.
  let compoundPred = NSCompoundPredicate(type: .AndPredicateType, subpredicates: [predicate, predicateTwo])


Now I set-up the subscription like this:

let subscription = CKSubscription(recordType: "Notifications",
        predicate: compoundPred,
        options: .FiresOnRecordCreation)

    let notificationInfo = CKNotificationInfo()

    notificationInfo.alertBody = "Someone replied to your post"
    notificationInfo.shouldBadge = true

    subscription.notificationInfo = notificationInfo

    publicDB.saveSubscription(subscription,
        completionHandler: ({subscription, error in.....etc})
      // handling this part

2 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,并在苹果网站上偶然发现了这条信息:

  

创建谓词包含CKReference字段的预订时,请确保在创建谓词时使用CKRecordID对象作为字段的值。在这种情况下使用CKRecord对象目前无效。

当我将我的CKQuerySubscription的谓词更改为使用CKRecordID而不是CKReference时,它按预期工作。我意识到这是一个老线程,但我很难找到这个问题的答案,因为谓词似乎在CKQuery和CKQuerySubscription之间表现不同。

答案 1 :(得分:1)

使用NSPredicate而不是NSCompoundPredicate初始化您的订阅:

let predicate = NSPredicate(format: "user = %@ AND read = %@",
    argumentArray: [userRef, ""])
let subscription = CKSubscription(recordType: "Notifications",
    predicate: predicate,
    options: .FiresOnRecordCreation)

根据我使用CloudKit的经验,这应该可行。