Уведомление о подписке 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 это должно работать.