2015-04-22 1 views
2

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

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

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

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

Я думаю, что CloudKit не работает со сложными предикатами. Кажется, я читал об этом где-то, но не могу найти точную ссылку. Но я нашел rdar о проблеме: http://www.openradar.me/18807663 –

+0

Спасибо @flinth. Я не пересматривал это через некоторое время, чтобы подтвердить, но это разочаровывает. –

ответ

1

Initialise подписку с NSPredicate вместо NSCompoundPredicate:

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

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

+0

Спасибо @ усы. Я попробовал ваш предикат, и, к сожалению, push-уведомление никогда не приходит. Возможно, я тестирую это неправильно, но я подумал, что яблоко попросило проверить, поступает ли уведомление через панель управления. Поэтому я запускаю приложение с другой учетной записью iCloud и помещаю его в фоновом режиме. Затем я добавляю новую запись в приборную панель. Это правильно? Подписка на панели управления с использованием вашего предиката выглядит так же, как и раньше - Notifications.read (равно строке) Notifications.user (равно ссылке). –

+0

Также, начиная с последней версии Xcode, она действует нечетно - мне пришлось избавиться от идентификатора subscriptionID и использовать удобную инициализацию, потому что, хотя я удалил подписку в информационной панели, при первом ее подписании она дает ошибку - «неверная попытка обновления запись из типа '_sub_trigger_sub_2ded4b5120b4a2aae398d61a681d5599' to '_sub_trigger_sub_f678ae78884bd7ce081d07cb60385af1' "; uuid = ....; ID контейнера = .... "Однако подписка находится на панели управления.Раньше, в первый раз, когда я разрешал подписываться на один и тот же идентификатор подписки после того, как я удалил его, вторая попытка дала мне ошибку, говоря, что она дублируется. –

+0

Как странно ... теперь, когда поведение ошибки внезапно прекратилось и работает так, как ожидалось. Это дало ошибку, как 3 раза раньше. Я начинаю задаваться вопросом, есть ли проблема с моим компьютером и моей установкой Xcode. Получали ли вы когда-либо подобную ошибку после удаления подписки, а затем повторно подписались с использованием того же идентификатора подписки? –

2

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

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

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

+0

Извините за задержанный ответ. Спасибо за информацию. Я на самом деле немного отошел от Cloudkit и в последнее время использовал Firebase. Но если мне когда-нибудь понадобится вернуться в Облачный, это хорошо знать. Благодаря! –

+0

@ReneeOlson Не проблема, и вы радушны - это определенно не очень интуитивно, поэтому, надеюсь, это избавит других от необходимости решать эту проблему. – Imperious

Смежные вопросы