Статьи

Как использовать Apple CloudKit для push-уведомлений

Apple представила свою платформу CloudKit вместе с iOS 8 в 2014 году. Хотя ее основной целью было выступать в качестве онлайн-базы данных для приложений iOS, CloudKit также предлагает множество других функций, включая push-уведомления.

В этом руководстве я покажу вам, как использовать инфраструктуру CloudKit для реализации push-уведомлений для ваших приложений iOS. Если вы хотите узнать больше о других функциях CloudKit, вы можете прочитать мой учебник, посвященный основам инфраструктуры:

  • Введение в CloudKit

Это руководство требует, чтобы вы использовали по крайней мере Xcode 8 с Swift 3. Вам также понадобится физическое устройство iOS для тестирования и учетная запись разработчика Apple, чтобы вы могли включить CloudKit для своего приложения.

Сначала мы рассмотрим преимущества (и недостатки) использования CloudKit для push-уведомлений вашего приложения.

Как вы увидите в этом руководстве, для настройки push-уведомлений с CloudKit вам не нужно беспокоиться о создании сертификатов и профилей обеспечения, как вы это делаете с другими облачными сервисами. Поскольку все сделано Apple, все, что вам нужно сделать, это включить CloudKit для вашего приложения, а все остальное работает.

Одной из лучших особенностей CloudKit для некоторых разработчиков является то, сколько вы получаете бесплатно. Существует много других компаний Backand-as-a-Service (BaaS), которые предлагают push-уведомления для приложений iOS, но у большинства из них есть ограничения на количество бесплатных уведомлений. CloudKit не ограничивает количество push-уведомлений, которые вы можете отправлять своим пользователям. Однако бесплатный уровень CloudKit ограничивает хранение данных, передачу данных и количество пользовательских запросов в секунду.

Еще одно преимущество использования CloudKit в ваших приложениях заключается в том, что, благодаря Apple, вам никогда не придется беспокоиться о стабильности и обслуживании сети. Перебои в работе сервисов Apple происходят очень редко и быстро устраняются. Это означает, что вы можете рассчитывать на то, что CloudKit всегда будет работать правильно для ваших пользователей.

Однако при использовании CloudKit следует помнить о том, что в настоящее время он недоступен на платформах, не принадлежащих Apple. Это означает, что если вы хотите создать версию приложения для Android, CloudKit не будет работать. Для кроссплатформенного решения я бы порекомендовал другой BaaS, такой как back4app (построенный на Parse), как я обсуждал в этом уроке:

  • iOS SDK
    Легкие iOS Push-уведомления с back4app

Для начала создайте новый проект в XCode из шаблона iOS> Приложение> Single View Application .

Как только Xcode создаст ваш проект, перейдите в навигатор проекта и нажмите на вкладку « Возможности ». На этом экране нажмите переключатель, чтобы включить iCloud, а затем установите флажок CloudKit :

Включение iCloud и CloudKit

После того, как вы включили CloudKit, вы можете перейти на панель мониторинга CloudKit для своего приложения.

Чтобы отправлять push-уведомления пользователям нашего приложения, мы собираемся создать тип записи GlobalNotification, который будет уведомлять всех пользователей о создании новой записи этого типа. Если раздел « Тип записи » на панели мониторинга CloudKit еще не открыт для вас после входа в систему, щелкните его на боковой панели.

Чтобы создать новый тип записи, нажмите на +   Кнопка в верхней части экрана. Заполните меню, как показано на следующем снимке экрана:

Тип записи GlobalNotification

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

Когда вы закончите, нажмите на кнопку Сохранить в правом нижнем углу.

Вернувшись в XCode, откройте файл AppDelegate.swift и добавьте следующие операторы импорта вверху кода:

1
2
import CloudKit
import UserNotifications

Этот код просто импортирует платформы CloudKit и UserNotifications. Мы будем использовать UserNotifications для управления разрешениями на уведомления и входящими уведомлениями. Если вы хотите узнать больше об этой платформе, вы можете прочитать мой учебник, освещающий ее здесь:

  • Введение в среду пользовательских уведомлений

Затем измените определение класса AppDelegate чтобы оно соответствовало протоколу UNUserNotificationCenterDelegate :

1
2
3
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
    …
}

Теперь нам нужно запросить разрешение на показ уведомлений. Для этого замените ваше application(_:didFinishLaunchingWithOptions:) метод application(_:didFinishLaunchingWithOptions:) следующим:

01
02
03
04
05
06
07
08
09
10
11
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
     
    UNUserNotificationCenter.current().delegate = self
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound], completionHandler: { authorized, error in
        if authorized {
            application.registerForRemoteNotifications()
        }
    })
     
    return true
}

С помощью этого кода мы просим пользователя разрешить показывать уведомления и, если они принимают, зарегистрировать приложение для push-уведомлений.

Теперь нам нужно реализовать метод application(_:didRegisterForRemoteNotificationsWithDeviceToken:) . Добавьте следующий код в ваш класс AppDelegate :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let subscription = CKQuerySubscription(recordType: «GlobalNotification», predicate: NSPredicate(format: «TRUEPREDICATE»), options: .firesOnRecordCreation)
     
    let info = CKNotificationInfo()
    info.alertBody = «A new notification has been posted!»
    info.shouldBadge = true
    info.soundName = «default»
     
    subscription.notificationInfo = info
     
    CKContainer.default().publicCloudDatabase.save(subscription, completionHandler: { subscription, error in
        if error == nil {
            // Subscription saved successfully
        } else {
            // An error occurred
        }
    })
}

С помощью этого кода мы сначала создаем объект CKQuerySubscription . Этот объект подписки сообщает CloudKit, для чего он должен отправлять уведомления. При инициализации этой подписки мы включаем следующее:

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

Затем мы создаем объект CKNotificationInfo , предоставляем ему некоторый контент, а затем назначаем его объекту подписки. Объект CKNotificationInfo — это способ форматирования push-уведомлений, доставляемых вашим пользователям. В этом примере мы настраиваем его со следующими свойствами:

  • alertBody "A new notification has been posted!"
  • Значение shouldBadge true . Это приведет к тому, что значок приложения на главном экране будет увеличивать свой номер для каждого приходящего уведомления.
  • soundName "default" . Это будет просто использовать звук уведомления iOS по умолчанию для вашего приложения. Если вы хотите использовать собственный звук, вам нужно будет использовать имя вашего звукового файла.
  • Массив desiredKeys с одним значением. Для каждого ключа, включенного в этот массив, CloudKit загрузит соответствующее значение из записи, которая активировала уведомление, и включит его в словарь информации пользователя для уведомления.

Далее мы назначаем информацию об уведомлении для подписки, которая затем сохраняется в общедоступной базе данных CloudKit для вашего приложения.

Чтобы вы могли видеть уведомление во время работы приложения, добавьте следующий метод в класс AppDelegate:

1
2
3
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    completionHandler([.alert, .sound])
}

Этот код использует платформу UserNotifications для отображения вашего уведомления, как будто ваше приложение вообще не работает.

Перед запуском приложения вам необходимо проверить, не вошло ли ваше тестовое устройство в учетную запись iCloud, перейдя в « Настройки» . В противном случае вам нужно будет сделать это, потому что API-интерфейсы CloudKit требуют, чтобы текущий пользователь вошел в систему.

Создайте и запустите ваше приложение из Xcode и примите запрос вашего приложения на отображение уведомлений. После того, как вы это сделаете, вернитесь на панель мониторинга CloudKit для своего приложения и нажмите « Типы подписок» на левой боковой панели. Вы должны увидеть новую подписку на записи GlobalNotification с триггером INSERT :

Тип подписки

Теперь нам осталось только отправить уведомление! По-прежнему в инструментальной панели CloudKit щелкните Зону по умолчанию под Общедоступными данными на левой боковой панели. Нажмите кнопку « или « Новая запись», чтобы создать новую запись GlobalNotification . Заполните содержимое всем, что вы хотите, и нажмите Сохранить в правом нижнем углу.

Как только ваша запись будет сохранена, вы должны увидеть, что уведомление сразу же появляется на вашем тестовом устройстве

уведомление

Как вы уже видели, вы можете легко реализовать push-уведомления для своего приложения iOS с помощью CloudKit. Настройка очень проста, с небольшим количеством шагов, а предоставляемые API позволяют получать любые push-уведомления, которые могут вам понадобиться для ваших приложений.

Как всегда, пожалуйста, оставляйте свои комментарии и отзывы в разделе комментариев ниже. И ознакомьтесь с некоторыми другими нашими курсами и учебниками по iOS!

  • Что нового в iOS 10

  • Создание расширений SiriKit в iOS 10

  • iOS 10: расширения службы уведомлений

  • Легкие iOS Push-уведомления с back4app