Основы уведомления о подписке CloudKit CKS

Я сегодня возился с CKSubscription. У меня есть несколько вопросов по этому поводу.

Я настраиваю свою подписку так:

-(void)addSubscriptions
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"TRUEPREDICATE"];

    CKSubscription *newRecordSub = [[CKSubscription alloc] initWithRecordType:_recordTypeName predicate:predicate options:CKSubscriptionOptionsFiresOnRecordCreation | CKSubscriptionOptionsFiresOnRecordUpdate | CKSubscriptionOptionsFiresOnRecordDeletion];

    CKNotificationInfo *noteInfo = [CKNotificationInfo new];
    noteInfo.alertBody = @"Update!";
    noteInfo.shouldBadge = YES;
    noteInfo.soundName = UILocalNotificationDefaultSoundName;
    newRecordSub.notificationInfo = noteInfo;

    CKContainer *container = [CKContainer defaultContainer];
    CKDatabase *privateDatabase = [container privateCloudDatabase];

    [privateDatabase saveSubscription:newRecordSub completionHandler:^(CKSubscription *subscription, NSError *error) {

    }];
}

ВОПРОС 1:

Разумеется, при создании подписки мне нужно сохранить ее в контейнере только один раз? Поскольку это называется сверхурочной работой приложения, я получаю сообщение об ошибке, просто говоря, дублируйте подписку, поэтому приложение работает должным образом, но должен ли я подходить к этому по-другому и не запускаться каждый раз?

Затем я настроил получение уведомлений на свой AppID и зарегистрировался для них в моем AppDelegate.

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
    [application registerUserNotificationSettings:settings];
    [application registerForRemoteNotifications];

Наконец, я обрабатываю эти уведомления, как показано ниже:

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    CKNotification *note = [CKNotification notificationFromRemoteNotificationDictionary:userInfo];

    if (note.notificationType == CKNotificationTypeQuery)
    {
        CKQueryNotification *queryNote = (CKQueryNotification *)note;
        CKRecordID *recordID = [queryNote recordID];
        [[NSNotificationCenter defaultCenter] postNotificationName:kCloudKitNewRecordFlightLog object:recordID];
    }
}

ВОПРОС 2:

Почему я не получаю никаких уведомлений в этот момент? Весь мой код запускается, и мое приложение обновляется, когда новые записи добавляются / удаляются, обновляются. Однако для уведомления пользователя звук, значок или баннер не отображаются.

ВОПРОС 3:

Разумно ли при получении уведомления облачного комплекта, чтобы локальное уведомление отправляло сообщение в соответствующее представление для обновления записей?


person Josh Kahane    schedule 12.11.2014    source источник
comment
вы должны создать вопрос о переполнении стека для каждого вопроса.   -  person Edwin Vermeer    schedule 12.11.2014
comment
Буду делать в будущем, извините! Тем не менее, спасибо за ваш ответ.   -  person Josh Kahane    schedule 12.11.2014


Ответы (1)


  1. Да, вам нужно установить их только один раз. Вы можете запросить подписки (используя fetchAllSubscriptionsWithCompletionHandler), чтобы узнать, следует ли вам их создавать. Или просто проигнорируйте ошибку.
  2. Это могло бы сработать, или вы могли бы настроить делегат-делегат.
person Edwin Vermeer    schedule 12.11.2014
comment
Спасибо, Эдвин. Интересно, что вы говорите, что подписки - это только общедоступная база данных. У меня эта подписка работает с моей частной базой данных, как показано, единственное, что она не отображает уведомления, несмотря на то, что все еще работает в фоновом режиме. - person Josh Kahane; 12.11.2014
comment
Это странно. С подписками вы должны получать уведомления только в том случае, если изменения были внесены кем-то, кроме того, кто сделал подписку. В частной базе данных вы будете единственным, кто будет иметь доступ к данным. Итак, вы говорите, что получаете уведомления о событиях в своем приложении? Должен признаться, я никогда не пробовал подписки в частной базе данных. Я предполагал, что это не сработает. - person Edwin Vermeer; 13.11.2014
comment
Ну, он работает на базовом уровне, он не предоставляет никаких баннеров, значков, звука и т. Д. Например, используя код в моем вопросе, я могу внести изменения в свой iPhone, и мой iPad получит это уведомление в didReceiveRemoteNotification. Я не знал, что обычно они будут только публичными. - person Josh Kahane; 13.11.2014
comment
@EdwinVermeer, почему вы говорите, что подписки должны работать только с общедоступной базой данных? Подписки можно использовать для уведомления других устройств пользователя о том, что одно из устройств внесло изменение в частную базу данных. - person ninjaneer; 06.12.2014