Уведомление о подписке CloudKit для CKReference не работает должным образом

Я пытаюсь настроить CKSubscription для записей, которые содержат поле с CKReference для пользователя. Но каждый раз, когда создается запись, она игнорирует эту часть составного предиката, и уведомление никогда не приходит. Есть ли что-то другое об использовании CKReference в предикате для CKSubscription? Я вхожу в панель управления, чтобы ввести новую запись под своим собственным идентификатором пользователя (при запуске другого пользователя в симуляторе), потому что я считаю, что я прочитал, что если запись поступает с устройства, он не получит уведомление. Любое понимание очень ценится, так как я застрял на этой неделе в течение недели и не могу найти в Интернете ничего конкретного для этого. Я могу получать истинные уведомления о предикатах типа, так что я думаю, что мои основные настройки в порядке.

На панели инструментов я вижу одну общую подписку для обоих тестовых пользователей, но не какой-либо конкретный recordID для обоих пользователей (имеет ли это значение?):

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

Когда я выполняю метод fetchAllSubscriptionWithCompletionHandler, он показывает конкретный идентификатор записи текущего пользователя для этого устройства как 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 ответа

У меня была такая же проблема, и я наткнулся на эту информацию на веб-сайте Apple:

При создании подписки, предикат которой содержит поле CKReference, обязательно используйте объект CKRecordID в качестве значения для поля при создании предиката. Использование объекта CKRecord в этом случае в настоящее время не работает.

Когда я изменил свой предикат для моей CKQuerySubscription, чтобы использовать CKRecordID вместо CKReference, он работал как ожидалось. Я понимаю, что это старый поток, но я изо всех сил пытался найти ответ на этот вопрос, так как предикат, кажется, ведет себя по-разному между CKQuery и CKQuerySubscription.

Инициализируйте вашу подписку с помощью NSPredicate вместо NSCompoundPredicate:

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

По моему опыту с CloudKit это должно работать.

Другие вопросы по тегам