Подписка для записи изменений

Когда результатами является главным образом то же как последний запрос, это неэффективно для Вашего приложения для повторения запроса. Вместо этого подпишитесь, чтобы записать изменения и позволить серверу выполнить запрос в фоновом режиме. Сервер уведомит Ваше приложение изменений, интересующих пользователя или приложение. Например, если один пользователь Вашего приложения интересуется иллюстрациями определенным художником, Ваше приложение может быть уведомлено, когда загружаются новые иллюстрации тем художником.

../Art/subscriptions_2x.png

Сохраните подписки к базе данных

В Вашем коде создайте объект подписки указание типа записи, предиката и типов изменений, о которых Вы хотите быть уведомленными. Тогда сохраните объект подписки к базе данных.

Создать и сохранить подписку

  1. Создайте объект предиката.

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"artist = %@", @"Mei Chen"];
  2. Создайте подписку, указывающую тип записи, предикат и опции уведомления.

    CKSubscription *subscription = [[CKSubscription alloc]
                                        initWithRecordType:@"Artwork"
                                        predicate:predicate
                                        options:CKSubscriptionOptionsFiresOnRecordCreation];

    Возможные значения для options параметр: CKSubscriptionOptionsFiresOnRecordCreation, CKSubscriptionOptionsFiresOnRecordDeletion, CKSubscriptionOptionsFiresOnRecordUpdate, и CKSubscriptionOptionsFiresOnce. Поскольку options параметр является битовой маской, можно подписаться на любую комбинацию типа изменений. Например, можно передать CKSubscriptionOptionsFiresOnRecordCreation | CKSubscriptionOptionsFiresOnRecordUpdate как options: параметр для получения уведомления обо всех новых данных.

  3. Создайте объект уведомления CloudKit.

    CKNotificationInfo *notificationInfo = [CKNotificationInfo new];
    notificationInfo.alertLocalizationKey = @"New artwork by your favorite artist.";
    notificationInfo.shouldBadge = YES;

    Для отображения локализованной строки пользователю установите уведомление alertLocalizationKey свойство (не alertBody свойство).

  4. Установите объект уведомления подписки в новый объект уведомления CloudKit.

    subscription.notificationInfo = notificationInfo;
  5. Сохраните подписку к базе данных.

    CKDatabase *publicDatabase = [[CKContainer containerWithIdentifier:[CKContainer defaultContainer]] publicCloudDatabase];
        [publicDatabase saveSubscription:subscription
                        completionHandler:^(CKSubscription *subscription, NSError *error) {
                            if (error)
                                // insert error handling
                        }
         ];

В XCode, выполненном Ваше приложение для сохранения подписки к базе данных.

Проверьте свои шаги

Проверьте, что подписка была сохранена к схеме. В Инструментальной панели CloudKit объект подписки появляется как тип подписки в схеме.

  1. В Инструментальной панели CloudKit выберите контейнер, используемый Вашим приложением от всплывающего меню в верхнем левом углу.

  2. В соответствии со Схемой, нажмите Subscription Types.

    Подписки появляются во втором столбце.

  3. Если необходимо, выберите подписку.

    Свойства подписки появляются в подробной области.

    ../Art/7_verify_subscriptions_2x.png../Art/7_verify_subscriptions_2x.png

Регистр для уведомлений нажатия

Сохранение подписок к базе данных автоматически не конфигурирует Ваше приложение для получения уведомлений подписки. CloudKit использует Apple Push Notification service (APNs) для отправки уведомлений подписки приложению, таким образом, приложение должно зарегистрироваться для уведомлений нажатия для получения их.

Для приложений для iOS добавьте этот код к application:didFinishLaunchingWithOptions: метод протокола для регистрации для уведомлений нажатия:

    // Register for push notifications
    UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert categories:nil];
    [application registerUserNotificationSettings:notificationSettings];
    [application registerForRemoteNotifications];

Для приложений Mac реализуйте applicationDidFinishLaunching: метод протокола для регистрации для уведомлений нажатия.

И для iOS и для приложений Mac, дополнительно реализуйте application:didRegisterForRemoteNotificationsWithDeviceToken: и application:didFailToRegisterForRemoteNotificationsWithError: методы для принятия соответствующих мер, когда приложение успешно или неуспешно регистрируется для уведомлений нажатия.

Уведомления нажатия дескриптора в коде

Затем, реализуйте application:didReceiveRemoteNotification: метод для обработки уведомлений подписки, когда они поступают. Для приложений для iOS, реализация UIApplicationDelegate метод протокола и для приложений Mac, реализуйте NSApplicationDelegate метод протокола. Например, реализуйте этот метод для обновления представлений, когда записи, соответствующие предикат, будут созданы, обновлены или удалены.

  1. Добавьте application:didReceiveRemoteNotification: метод протокола делегату приложения.

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    }
  2. В application:didReceiveRemoteNotification: метод, преобразуйте userInfo параметр к aCKNotification объект.

    CKNotification *cloudKitNotification = [CKNotification notificationFromRemoteNotificationDictionary:userInfo];
  3. Получите организацию уведомления.

    NSString *alertBody = cloudKitNotification.alertBody;
  4. Получите новую или измененную запись от CKQueryNotification объект.

    if (cloudKitNotification.notificationType == CKNotificationTypeQuery) {
       CKRecordID *recordID = [(CKQueryNotification *)cloudKitNotification recordID];
    }
  5. Представления обновления или уведомляют пользователя согласно рекордным изменениям.

Тестовые подписки

Можно первоначально протестировать подписки путем выполнения приложения через XCode и использования Инструментальной панели CloudKit, чтобы создать, изменить, или удалить записи, как описано в Добавляют, Изменяют и Удаляют Записи. Тогда полностью протестируйте подписки путем выполнения приложения на многократных устройствах. Используйте одно устройство для внесения изменений и другого устройства для получения уведомлений подписки. Вы используете многократные устройства, потому что уведомление не отправляется в то же устройство, породившее уведомление.

Для iOS используйте устройство на iOS (не Средство моделирования iOS) для тестирования уведомлений подписки. Ваше приложение успешно регистрируется для уведомлений нажатия, если диалоговое окно, просящее, чтобы разрешение пользователя Ваше приложение получило уведомления.

Резюме

В этой главе Вы учились как: