Добавьте push-уведомления в приложение iOS

1. Введение

Последнее обновление: 6 января 2020 г.

Firebase Cloud Messaging (FCM) — кроссплатформенное решение для обмена сообщениями, позволяющее надежно отправлять сообщения бесплатно.

Используя FCM, вы можете уведомить клиентское приложение о наличии нового электронного письма или других данных для синхронизации. Вы можете отправлять уведомления, чтобы стимулировать повторное вовлечение и удержание пользователей. В таких случаях, как обмен мгновенными сообщениями, сообщение может передавать клиентскому приложению полезную нагрузку объемом до 4 КБ.

Как это работает?

Реализация FCM включает два основных компонента для отправки и получения:

  1. Доверенная среда, например Cloud Functions for Firebase или сервер приложений, на котором можно создавать, нацеливать и отправлять сообщения.
  2. Клиентское приложение для iOS, Android или веб-приложение (JavaScript), которое получает сообщения через соответствующую платформенно-зависимую транспортную службу.

Архитектурный обзор FCM

dc54f5190ee8926a.png

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

  1. Инструменты для создания и формирования запросов на уведомления. Компоновщик уведомлений предоставляет графический интерфейс для создания запросов на уведомления. Для полной автоматизации и поддержки всех типов сообщений необходимо создавать запросы в доверенной серверной среде, поддерживающей Firebase Admin SDK или протоколы сервера FCM. Этой средой может быть Cloud Functions for Firebase, Google App Engine или ваш собственный сервер приложений.
  2. Бэкэнд FCM, который (помимо прочих функций) принимает запросы сообщений, осуществляет разветвление сообщений по темам и генерирует метаданные сообщений, такие как идентификатор сообщения.
  3. Транспортный уровень уровня платформы, который направляет сообщение целевому устройству, управляет доставкой сообщения и при необходимости применяет конфигурацию, специфичную для платформы. Этот транспортный уровень включает в себя:
  • Транспортный уровень Android (ATL) для устройств Android с сервисами Google Play
  • Служба push-уведомлений Apple (APNs) для устройств iOS
  • Протокол Web Push для веб-приложений
  1. FCM SDK на устройстве пользователя, где уведомление отображается или сообщение обрабатывается в соответствии с состоянием приложения (в приоритетном/фоновом режиме) и любой соответствующей логикой приложения.

Что вы построите

В этой лабораторной работе вы добавите push-уведомления в пример приложения iOS с помощью FCM.

Чему вы научитесь

  • Как подписать и отписать пользователя на push-уведомления
  • Как обрабатывать входящие push-сообщения
  • Как отобразить уведомление
  • Как реагировать на клики по уведомлениям

Что вам понадобится

  • Xcode 11.0 или более поздняя версия
  • CocoaPods 1.9.0 или более поздняя версия
  • Аккаунт разработчика Apple
  • Физическое устройство iOS для запуска вашего приложения
  • Базовые знания Swift

2. Подготовка

Загрузите пример кода

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

Образец можно получить двумя способами:

  • Клонируйте репозиторий Git:
$ git clone https://github.com/firebase/quickstart-ios.git
  • Загрузите ZIP-файл:

Если вы загрузите исходный код в виде ZIP-файла, распаковка даст вам корневую папку quickstart-ios .

Создать новое приложение

Создайте собственное тестовое приложение, выполнив следующие шаги (ниже приведены шаги для XCode 12.3):

  1. Откройте XCode и выберите Создать новый проект Xcode .
  2. Выберите Приложение и нажмите Далее .

d6a3fc16ba7d4f72.png

  1. Введите название продукта (например, MessagingExample)
  2. Выберите команду (если вы еще не создали команду, настройте ее в учетной записи разработчика Apple).
  3. Введите идентификатор организации (например, com. your-name )
  4. Введите идентификатор пакета (например, com. your-name .MessagingExample , он должен быть уникальным среди всех приложений iOS).
  5. В раскрывающемся списке Интерфейс выберите Раскадровка .
  6. В раскрывающемся списке «Жизненный цикл» выберите «Делегат приложения UIKit» .
  7. В разделе «Язык» выберите Swift .
  8. Нажмите кнопку «Далее» .

a07d72459f65dcc1.png

Bundle Identifier вам понадобится при создании ключа APN и регистрации вашего приложения в проекте Firebase.

3. Настройка APN

Создайте ключ аутентификации

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

Чтобы создать ключ аутентификации:

  1. В своей учетной записи разработчика перейдите в раздел Сертификаты, идентификаторы и профили , а затем в раздел Ключи .

708ac6e36366b11f.png

  1. Нажмите кнопку «Добавить» (+) в правом верхнем углу.

e71849c7e6e4e714.png

  1. Введите описание ключа авторизации APNs.
  2. В разделе «Ключевые службы» установите флажок APNs и нажмите «Продолжить» .

65c9930dc2d8bf1c.png

  1. Нажмите «Зарегистрироваться» , а затем «Скачать» . Сохраните ключ в надёжном месте. Загрузка производится один раз, и восстановить ключ позже будет невозможно.

bda45effb420b7c2.png

Создать идентификатор приложения

Идентификатор приложения — это уникальный идентификатор приложения. Обычно он представлен в виде обратного домена.

  1. Перейдите в Центр разработчиков Apple и войдите в систему.
  2. Перейдите в раздел Сертификаты, идентификаторы и профили .
  3. Перейдите в раздел Идентификаторы .
  4. Нажмите кнопку + , чтобы создать новый идентификатор приложения. 2a325a323b652124.png
  5. Выберите переключатель «Идентификаторы приложений» и нажмите «Продолжить» .

fb24e3374de047a3.png

  1. Выберите Приложение и нажмите Продолжить .

cca5eb32736f947.png

  1. Чтобы создать новый идентификатор приложения:
  2. Введите имя для идентификатора вашего приложения.
  3. Введите идентификатор команды . Это значение должно совпадать с идентификатором команды на вкладке «Членство».
  4. В разделе «Суффикс идентификатора приложения» выберите «Явный идентификатор приложения» , затем введите свой идентификатор пакета . 7363c4d1962b486d.png
  5. В разделе «Службы приложений» убедитесь, что установлен флажок «Push-уведомления» . 8e158017bc31fd46.png
  6. Нажмите «Продолжить» и проверьте правильность введенных данных:
  7. Значение идентификатора должно соответствовать конкатенации значений идентификатора команды и идентификатора пакета.
  8. Push-уведомления должны быть настраиваемыми
  9. Нажмите «Зарегистрироваться» , чтобы создать идентификатор приложения.

Создать профиль

Чтобы протестировать приложение на этапе разработки, вам понадобится профиль для разработки, чтобы разрешить вашим устройствам запускать приложение, которое еще не опубликовано в App Store.

  1. Перейдите в Центр разработчиков Apple и войдите в систему.
  2. Перейдите в раздел Сертификаты, идентификаторы и профили .
  3. В раскрывающемся меню в левом верхнем углу выберите iOS, tvOS, watchOS, если этот вариант еще не выбран, затем перейдите в раздел Профили .
  4. Нажмите кнопку + , чтобы создать новый профиль. 100604ffceac6a1d.png
  5. Выберите «Разработка приложений iOS» в качестве типа профиля подготовки, затем нажмите « Продолжить» .

7d4d20883a4c4142.png

  1. В раскрывающемся меню выберите идентификатор приложения, который вы хотите использовать, затем нажмите Продолжить .
  2. Выберите сертификат разработки iOS для идентификатора приложения, выбранного на предыдущем шаге, затем нажмите Продолжить .
  3. Выберите устройства iOS, которые вы хотите включить в профиль подготовки, затем нажмите «Продолжить» . Убедитесь, что выбраны все устройства, которые вы хотите использовать для тестирования.
  4. Введите имя для этого профиля подготовки (например, MessagingExampleProfile ), затем нажмите кнопку «Создать» .

7346087f5a0179f2.png

  1. Нажмите «Загрузить» , чтобы сохранить профиль обеспечения на вашем Mac.

548c8c27f3ce5bca.png

  1. Дважды щелкните файл профиля обеспечения, чтобы установить его.

4. Добавление Firebase в ваш iOS-проект

Создать проект Firebase

Прежде чем добавить Firebase в приложение iOS, необходимо создать проект Firebase для подключения к нему. Подробнее о проектах Firebase можно узнать в статье «Понимание проектов Firebase».

  1. В консоли Firebase нажмите Добавить проект , затем выберите или введите имя проекта . caf43df5174a530e.png

Если у вас есть существующий проект Google Cloud Platform (GCP), вы можете выбрать проект из раскрывающегося меню, чтобы добавить в него ресурсы Firebase.

  1. (Необязательно) Если вы создаете новый проект, вы можете изменить идентификатор проекта .

Firebase автоматически присваивает вашему проекту уникальный идентификатор. Подробнее о том, как Firebase использует идентификатор проекта, читайте в статье «Понимание проектов Firebase».

  1. Нажмите «Продолжить» .
  2. Настройте Google Analytics для своего проекта, что позволит вам получить оптимальную работу с любым из следующих продуктов Firebase:
  • Firebase Crashlytics
  • Прогнозы Firebase
  • Облачный обмен сообщениями Firebase
  • Обмен сообщениями внутри приложения Firebase
  • Удаленная настройка Firebase
  • A/B-тестирование Firebase

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

ffbcd801d08078b2.png

473c89d0a404f066.png

  1. Нажмите «Создать проект» (или «Добавить Firebase» , если вы используете существующий проект GCP).

Firebase автоматически выделяет ресурсы для вашего проекта Firebase. После завершения процесса вы будете перенаправлены на страницу обзора вашего проекта Firebase в консоли Firebase.

Зарегистрируйте свое приложение в Firebase

После создания проекта Firebase вы можете добавить в него свое приложение iOS.

Посетите раздел «Понимание проектов Firebase», чтобы узнать больше о передовых методах и рекомендациях по добавлению приложений в проект Firebase, в том числе о том, как обрабатывать несколько вариантов сборки.

  1. Перейдите в консоль Firebase.
  2. В центре страницы обзора проекта щелкните значок iOS , чтобы запустить рабочий процесс настройки.

Если вы уже добавили приложение в свой проект Firebase, нажмите «Добавить приложение», чтобы отобразить параметры платформы.

549e710c09b601ea.png

  1. Введите идентификатор пакета вашего приложения в поле «Идентификатор пакета iOS» .
  2. (Необязательно) Введите другую информацию о приложении: псевдоним приложения и идентификатор App Store .
  3. Нажмите «Зарегистрировать приложение» .

7a2bd11d13365c.png

Добавьте файл конфигурации Firebase

  1. Нажмите «Загрузить GoogleService-Info.plist» , чтобы получить файл конфигурации Firebase iOS ( GoogleService-Info.plist ). 625594126a8943bf.png
  2. Переместите файл конфигурации в корневой каталог проекта Xcode. При появлении запроса выберите добавление файла конфигурации во все целевые объекты.

aa100af06c7a74e5.png

Если в вашем проекте несколько идентификаторов пакетов, необходимо связать каждый идентификатор пакета с зарегистрированным приложением в консоли Firebase, чтобы каждое приложение могло иметь свой собственный файл GoogleService-Info.plist .

Закройте XCode.

Добавьте Firebase SDK в свое приложение

Мы рекомендуем использовать CocoaPods для установки библиотек Firebase. Однако, если вы предпочитаете не использовать CocoaPods, вы можете напрямую интегрировать фреймворки SDK или использовать бета-версию Swift Package Manager.

  1. Создайте Podfile, если у вас его ещё нет. Если вы используете пример быстрого старта, проект Xcode и Podfile (с модулями) уже есть.
$ cd MessagingExample
$ pod init
  1. Добавьте в Podfile модули Firebase, которые вы хотите использовать в своем приложении.

Вы можете добавить любой из поддерживаемых продуктов Firebase в свое приложение iOS.

В пример быстрого старта добавлены SDK Google Analytics и Firebase Cloud Messaging.

# Add the Firebase pod for Google Analytics
pod 'Firebase/Analytics'

# Add the pod for Firebase Cloud Messaging
pod 'Firebase/Messaging'
  1. Установите модули, затем откройте файл .xcworkspace , чтобы увидеть проект в Xcode:
$ pod install
  1. Откройте MessagingExample.xcworkspace и нажмите кнопку Далее в консоли Firebase. 1c5adae5b6e81655.png

Инициализируйте Firebase в вашем приложении

Вам потребуется добавить код инициализации Firebase в ваше приложение.

Импортируйте модуль Firebase и настройте общий экземпляр (в примере быстрого старта модуль Firebase уже импортирован).

  1. Импортируйте модуль Firebase в ваш UIApplicationDelegate :

AppDelegate.swift

import UIKit
import Firebase // Add this line
  1. Настройте общий экземпляр FirebaseApp, обычно в application:didFinishLaunchingWithOptions: вашего приложения:

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure() // Add this line
  return true
}
  1. Нажмите «Далее» в консоли Firebase. df93274c5922fd55.png
  2. Пакеты Firebase SDK будут добавлены в ваше приложение. Нажмите «Продолжить», чтобы перейти в консоль . 21b24098a470aa40.png

5. Настройка клиента FCM

Загрузите свой ключ аутентификации APNs

Загрузите свой ключ аутентификации APNs в Firebase.

  1. Внутри вашего проекта в консоли Firebase выберите значок шестеренки, выберите Настройки проекта , а затем выберите вкладку Облачные сообщения .

e1fcc1f1ace520e9.png

  1. В разделе «Ключ аутентификации APNs» в разделе «Конфигурация приложения Apple» нажмите кнопку «Загрузить» , чтобы загрузить ключ аутентификации разработки, ключ аутентификации производства или оба. Требуется как минимум один.

87ee87266eab43c4.png

  1. Перейдите к месту сохранения ключа, выберите его и нажмите «Открыть» . Добавьте идентификатор ключа (доступен в разделе «Сертификаты, идентификаторы и профили» в Центре разработчиков Apple) и нажмите « Загрузить» . 1491c513285d06e0.png

Зарегистрируйтесь для получения удаленных уведомлений

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

В примере быстрого старта registerForRemoteNotifications уже добавлен.

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure()
  // [START register for remote notifications]
  if #available(iOS 10.0, *) {
    // For iOS 10 display notification (sent via APNS)
    UNUserNotificationCenter.current().delegate = self
        
    let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
    UNUserNotificationCenter.current().requestAuthorization(options: authOptions, completionHandler: {_, _ in })
  } else {
    let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
    application.registerUserNotificationSettings(settings)
  }

  application.registerForRemoteNotifications()
  // [END register for remote notifications]
  return true
}

Назначьте свойство делегата UNUserNotificationCenter , добавив эти строки в конец AppDelegate.swift.

AppDelegate.swift

@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate {

  // Receive displayed notifications for iOS 10 devices.
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              willPresent notification: UNNotification,
    withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    let userInfo = notification.request.content.userInfo

    // Print full message.
    print(userInfo)

    // Change this to your preferred presentation option
    completionHandler([[.alert, .sound]])
  }

  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse,
                              withCompletionHandler completionHandler: @escaping () -> Void) {
    let userInfo = response.notification.request.content.userInfo

    // Print full message.
    print(userInfo)

    completionHandler()
  }
}

Установить делегата обмена сообщениями

Чтобы получать регистрационные токены, реализуйте протокол делегата обмена сообщениями и настройте свойство delegate FIRMessaging после вызова [FIRApp configure] . Например, если ваш делегат приложения соответствует протоколу делегата обмена сообщениями, вы можете установить делегат в application:didFinishLaunchingWithOptions: на самого себя (в примере быстрого старта он уже установлен).

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure()
  Messaging.messaging().delegate = self // Add this line
  // [START register for remote notifications]
  if #available(iOS 10.0, *) {
    // For iOS 10 display notification (sent via APNS)
    UNUserNotificationCenter.current().delegate = self
        
    let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
    UNUserNotificationCenter.current().requestAuthorization(options: authOptions, completionHandler: {_, _ in })
  } else {
    let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
    application.registerUserNotificationSettings(settings)
  }

  application.registerForRemoteNotifications()
  // [END register for remote notifications]
  return true
}

Назначьте свойство делегата FIRMessaging , добавив эти строки в конец AppDelegate.swift.

AppDelegate.swift

extension AppDelegate : MessagingDelegate {
  func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
    print("Firebase registration token: \(String(describing: fcmToken))")
    
    let dataDict:[String: String] = ["token": fcmToken ?? ""]
    NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
  }
}

Добавить возможности

Вы добавили возможность push-уведомлений в разделе «Создание идентификатора приложения», но вам также необходимо добавить эту возможность в XCode, выполнив следующие шаги (нижеприведенные шаги относятся к XCode 12.3):

  1. Щелкните название проекта в области навигатора.
  2. Нажмите Подписание и возможности .
  3. Нажмите + Возможность .

7207dce45aaa0fa.png

  1. Дважды щелкните «Фоновые режимы» .
  2. Нажмите +Возможность еще раз.
  3. Дважды щелкните Push-уведомления .
  4. Проверьте Удаленные уведомления в разделах Фоновые режимы .

11a0a4f8a409fe44.png

6. Отправить уведомление

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

  1. Установите и запустите приложение на целевом устройстве. Вам необходимо будет принять запрос на разрешение получать удалённые уведомления.
  2. Получите токен регистрации в журнале XCode.

b9383e848d00ab04.png

  1. Убедитесь, что приложение работает в фоновом режиме на устройстве.
  2. Откройте редактор уведомлений и выберите Новое уведомление .
  3. Введите текст сообщения. 8f57ae055ce64321.png
  4. Выберите Отправить тестовое сообщение .
  5. В поле Добавить регистрационный токен FCM введите регистрационный токен, полученный на шаге 2.
  6. Нажмите кнопку Тест .

После нажатия кнопки «Тест» целевое клиентское устройство (с приложением в фоновом режиме) должно получить уведомление в центре уведомлений.

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

b790de9a3e0dc1ef.png

7. Поздравления

Поздравляем, вы успешно отправили тестовое сообщение!

В FCM есть еще множество функций и настроек, например, подписка на темы.

Если вас это интересует, ознакомьтесь с официальным документом разработчика .

Что дальше?

Ознакомьтесь с некоторыми из этих практикумов.

Дальнейшее чтение