Подписка для записи изменений
Когда результатами является главным образом то же как последний запрос, это неэффективно для Вашего приложения для повторения запроса. Вместо этого подпишитесь, чтобы записать изменения и позволить серверу выполнить запрос в фоновом режиме. Сервер уведомит Ваше приложение изменений, интересующих пользователя или приложение. Например, если один пользователь Вашего приложения интересуется иллюстрациями определенным художником, Ваше приложение может быть уведомлено, когда загружаются новые иллюстрации тем художником.
Сохраните подписки к базе данных
В Вашем коде создайте объект подписки указание типа записи, предиката и типов изменений, о которых Вы хотите быть уведомленными. Тогда сохраните объект подписки к базе данных.
Создать и сохранить подписку
Создайте объект предиката.
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"artist = %@", @"Mei Chen"];
Создайте подписку, указывающую тип записи, предикат и опции уведомления.
CKSubscription *subscription = [[CKSubscription alloc]
initWithRecordType:@"Artwork"
predicate:predicate
options:CKSubscriptionOptionsFiresOnRecordCreation];
Возможные значения для
options
параметр:CKSubscriptionOptionsFiresOnRecordCreation
,CKSubscriptionOptionsFiresOnRecordDeletion
,CKSubscriptionOptionsFiresOnRecordUpdate
, иCKSubscriptionOptionsFiresOnce
. Посколькуoptions
параметр является битовой маской, можно подписаться на любую комбинацию типа изменений. Например, можно передатьCKSubscriptionOptionsFiresOnRecordCreation | CKSubscriptionOptionsFiresOnRecordUpdate
какoptions:
параметр для получения уведомления обо всех новых данных.Создайте объект уведомления CloudKit.
CKNotificationInfo *notificationInfo = [CKNotificationInfo new];
notificationInfo.alertLocalizationKey = @"New artwork by your favorite artist.";
notificationInfo.shouldBadge = YES;
Для отображения локализованной строки пользователю установите уведомление
alertLocalizationKey
свойство (неalertBody
свойство).Установите объект уведомления подписки в новый объект уведомления CloudKit.
subscription.notificationInfo = notificationInfo;
Сохраните подписку к базе данных.
CKDatabase *publicDatabase = [[CKContainer containerWithIdentifier:[CKContainer defaultContainer]] publicCloudDatabase];
[publicDatabase saveSubscription:subscription
completionHandler:^(CKSubscription *subscription, NSError *error) {
if (error)
// insert error handling
}
];
В XCode, выполненном Ваше приложение для сохранения подписки к базе данных.
Проверьте свои шаги
Проверьте, что подписка была сохранена к схеме. В Инструментальной панели CloudKit объект подписки появляется как тип подписки в схеме.
В Инструментальной панели CloudKit выберите контейнер, используемый Вашим приложением от всплывающего меню в верхнем левом углу.
В соответствии со Схемой, нажмите Subscription Types.
Подписки появляются во втором столбце.
Если необходимо, выберите подписку.
Свойства подписки появляются в подробной области.
Регистр для уведомлений нажатия
Сохранение подписок к базе данных автоматически не конфигурирует Ваше приложение для получения уведомлений подписки. 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
метод протокола. Например, реализуйте этот метод для обновления представлений, когда записи, соответствующие предикат, будут созданы, обновлены или удалены.
Добавьте
application:didReceiveRemoteNotification:
метод протокола делегату приложения.- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
}
В
application:didReceiveRemoteNotification:
метод, преобразуйтеuserInfo
параметр к aCKNotification
объект.CKNotification *cloudKitNotification = [CKNotification notificationFromRemoteNotificationDictionary:userInfo];
Получите организацию уведомления.
NSString *alertBody = cloudKitNotification.alertBody;
Получите новую или измененную запись от
CKQueryNotification
объект.if (cloudKitNotification.notificationType == CKNotificationTypeQuery) {
CKRecordID *recordID = [(CKQueryNotification *)cloudKitNotification recordID];
}
Представления обновления или уведомляют пользователя согласно рекордным изменениям.
Тестовые подписки
Можно первоначально протестировать подписки путем выполнения приложения через XCode и использования Инструментальной панели CloudKit, чтобы создать, изменить, или удалить записи, как описано в Добавляют, Изменяют и Удаляют Записи. Тогда полностью протестируйте подписки путем выполнения приложения на многократных устройствах. Используйте одно устройство для внесения изменений и другого устройства для получения уведомлений подписки. Вы используете многократные устройства, потому что уведомление не отправляется в то же устройство, породившее уведомление.
Для iOS используйте устройство на iOS (не Средство моделирования iOS) для тестирования уведомлений подписки. Ваше приложение успешно регистрируется для уведомлений нажатия, если диалоговое окно, просящее, чтобы разрешение пользователя Ваше приложение получило уведомления.
Резюме
В этой главе Вы учились как:
Подпишитесь для записи изменений при помощи предиката
Уведомления подписки дескриптора