Онлайн курсы по Swift

Вступление

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

В этом руководстве я покажу вам, как использовать инфраструктуру CloudKit для реализации push-уведомлений в iOS приложениях.

 

1. Зачем использовать CloudKit?

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

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

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

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

Однако, недостаток, который вам следует знать при использовании CloudKit, заключается в том, что он не доступен на других платформах, отличных от Apple. Это означает, что если вы хотите создать Android-версию своего приложения, CloudKit не будет работать.

 

2. Настройка CloudKit
Для начала создайте новый проект в Xcode из шаблона iOS > Application > Single View Application.

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

 

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

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

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

 

 

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

Когда всё будет готово, нажмите кнопку Save в нижнем правом углу.

 

3. Настройка приложения

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

 

import CloudKit
import UserNotifications

 

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

Далее, отредактируйте определение вашего класса AppDelegate чтобы оно согласовывалось с протоколом UNUserNotificationCenterDelegate :

 

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
    ...
}

 

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

 

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:

 

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 какие уведомления он должен отправлять. При инициализации этой подписки, мы добавляем следующее:

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

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

 

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

 

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

Вот так, вы сможете видеть уведомление, пока ваша приложение запущено, добавьте следующие метод в ваш класс AppDelegate:

 

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

 

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

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

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

 

 

4. Отправка уведомлений

Ну вот, всё что нам осталось сделать это отправить уведомление! Всё ещё в панели управления CloudKit, нажмите на Default Zone под Public Data на левой панели. Нажмите либо на кнопку + или на New Record, чтобы создать новую запись GlobalNotification. Заполните содержимое (content) чем хотите и нажмите кнопку Save в правом нижнем углу.

Сразу после сохранения вашей записи, на вашем тестовом устройстве вы должны увидеть уведомление:

 

 

Заключение

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

Пролистать наверх