1. Введение
Последнее обновление: 06.01.2020
Firebase Cloud Messaging (FCM) — это кроссплатформенное решение для обмена сообщениями, позволяющее надежно и бесплатно отправлять сообщения.
С помощью FCM можно уведомлять клиентское приложение о наличии новых электронных писем или других данных для синхронизации. Отправка уведомлений может способствовать повторному вовлечению и удержанию пользователей. В таких сценариях использования, как обмен мгновенными сообщениями, сообщение может передавать в клиентское приложение полезную нагрузку размером до 4 КБ.
Как это работает?
Реализация FCM включает два основных компонента для отправки и приема:
- Надежная среда, такая как Cloud Functions for Firebase или сервер приложений, на котором можно создавать, отправлять и направлять сообщения.
- Клиентское приложение для iOS, Android или веб-приложение (JavaScript), которое получает сообщения через соответствующую транспортную службу, специфичную для платформы.
Архитектурный обзор FCM

FCM опирается на следующий набор компонентов, которые формируют, передают и принимают сообщения:
- Инструменты для составления или создания запросов на уведомления. Компоновщик уведомлений предоставляет графический интерфейс для создания запросов на уведомления. Для полной автоматизации и поддержки всех типов сообщений необходимо создавать запросы на уведомления в доверенной серверной среде, поддерживающей Firebase Admin SDK или протоколы сервера FCM. Это может быть Cloud Functions for Firebase, Google App Engine или ваш собственный сервер приложений.
- Бэкенд FCM, который (среди прочих функций) принимает запросы на сообщения, осуществляет распределение сообщений по темам и генерирует метаданные сообщений, такие как идентификатор сообщения.
- Транспортный уровень платформы, который маршрутизирует сообщение к целевому устройству, обрабатывает доставку сообщения и применяет, при необходимости, конфигурацию, специфичную для платформы. Этот транспортный уровень включает в себя:
- Транспортный уровень Android (ATL) для устройств Android с сервисами Google Play.
- Сервис push-уведомлений Apple (APNs) для устройств iOS
- Протокол веб-push для веб-приложений
- 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):
- Откройте Xcode и выберите «Создать новый проект Xcode» .
- Выберите приложение и нажмите «Далее» .

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

Идентификатор пакета (Bundle Identifier) понадобится вам при создании ключа APN и регистрации вашего приложения в проекте Firebase.
3. Настройка APN
Создайте ключ аутентификации
В этом разделе описывается, как сгенерировать ключ аутентификации для идентификатора приложения, для которого включены push-уведомления. Если у вас уже есть ключ, вы можете использовать его вместо генерации нового.
Для создания ключа аутентификации:
- В своей учетной записи разработчика перейдите в раздел «Сертификаты, идентификаторы и профили» , а затем в раздел «Ключи» .

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

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

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

Создайте идентификатор приложения.
Идентификатор приложения (App ID) — это уникальный идентификатор, позволяющий однозначно определить приложение. По общепринятой практике он представляется в виде перевернутого домена.
- Перейдите в Центр для разработчиков Apple и войдите в систему.
- Перейдите в раздел «Сертификаты, идентификаторы и профили» .
- Перейдите в раздел «Идентификаторы» .
- Нажмите кнопку «+» , чтобы создать новый идентификатор приложения.

- Выберите переключатель «Идентификаторы приложений» и нажмите «Продолжить» .

- Выберите приложение и нажмите «Продолжить» .

- Чтобы создать новый идентификатор приложения:
- Введите имя для идентификатора вашего приложения.
- Введите идентификатор команды . Это значение должно совпадать с идентификатором команды на вкладке «Участие».
- В разделе «Суффикс идентификатора приложения» выберите «Явный идентификатор приложения» , а затем введите идентификатор пакета .

- В разделе «Службы приложений» убедитесь, что установлен флажок «Push-уведомления» .

- Нажмите «Продолжить» и убедитесь, что введенные данные верны:
- Значение поля Identifier должно совпадать с результатом объединения значений Team ID и Bundle ID.
- Push-уведомления должны быть настраиваемыми.
- Нажмите «Зарегистрироваться» , чтобы создать идентификатор приложения.
Создать профиль
Для тестирования вашего приложения в процессе разработки вам потребуется профиль для разработчиков, который позволит авторизовать ваши устройства для запуска приложения, еще не опубликованного в App Store.
- Перейдите в Центр для разработчиков Apple и войдите в систему.
- Перейдите в раздел «Сертификаты, идентификаторы и профили» .
- В выпадающем меню в верхнем левом углу выберите iOS, tvOS, watchOS ( если этот пункт еще не выбран), затем перейдите в раздел «Профили» .
- Нажмите кнопку «+» , чтобы создать новый профиль.

- Выберите «Разработка iOS-приложений» в качестве типа профиля подготовки, затем нажмите «Продолжить» .

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

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

- Для установки дважды щелкните файл профиля подготовки.
4. Добавление Firebase в ваш iOS-проект
Создайте проект Firebase.
Прежде чем добавить Firebase в ваше iOS-приложение, вам необходимо создать проект Firebase для подключения к вашему iOS-приложению. Подробнее о проектах Firebase можно узнать в разделе «Понимание проектов Firebase».
- В консоли Firebase нажмите «Добавить проект» , затем выберите или введите название проекта .

Если у вас уже есть проект в Google Cloud Platform (GCP), вы можете выбрать его из выпадающего меню, чтобы добавить ресурсы Firebase в этот проект.
- (Необязательно) При создании нового проекта вы можете изменить идентификатор проекта .
Firebase автоматически присваивает вашему проекту Firebase уникальный идентификатор. Чтобы узнать, как Firebase использует идентификатор проекта, посетите раздел «Понимание проектов Firebase».
- Нажмите «Продолжить» .
- Настройте Google Analytics для своего проекта, что позволит вам оптимально использовать любой из следующих продуктов Firebase:
- Firebase Crashlytics
- Прогнозы Firebase
- Firebase Cloud Messaging
- Firebase In-App Messaging
- Firebase Remote Config
- A/B-тестирование в Firebase
При появлении запроса выберите, использовать ли существующую учетную запись Google Analytics или создать новую. Если вы выберете создание новой учетной записи, выберите место хранения отчетов Analytics, а затем примите настройки обмена данными и условия использования Google Analytics для вашего проекта.


- Нажмите «Создать проект» (или «Добавить Firebase» , если вы используете существующий проект GCP).
Firebase автоматически выделяет ресурсы для вашего проекта Firebase. После завершения процесса вы перейдете на страницу обзора вашего проекта Firebase в консоли Firebase.
Зарегистрируйте свое приложение в Firebase.
После создания проекта Firebase вы можете добавить в него свое iOS-приложение.
Посетите раздел «Понимание проектов Firebase», чтобы узнать больше о передовых методах и особенностях добавления приложений в проект Firebase, включая способы обработки нескольких вариантов сборки.
- Перейдите в консоль Firebase.
- В центре страницы обзора проекта нажмите на значок iOS , чтобы запустить процесс настройки.
Если вы уже добавили приложение в свой проект Firebase, нажмите «Добавить приложение», чтобы отобразить параметры платформы.

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

Добавьте файл конфигурации Firebase.
- Нажмите «Скачать GoogleService-Info.plist» , чтобы получить файл конфигурации Firebase для iOS (
GoogleService-Info.plist).
- Переместите файл конфигурации в корневую папку вашего проекта Xcode. При появлении запроса выберите этот вариант, чтобы добавить файл конфигурации ко всем целям.

Если в вашем проекте используется несколько идентификаторов пакетов (bundle ID), необходимо связать каждый идентификатор пакета с зарегистрированным приложением в консоли Firebase, чтобы каждое приложение имело свой собственный файл GoogleService-Info.plist .
Закройте Xcode.
Добавьте SDK Firebase в ваше приложение.
Мы рекомендуем использовать CocoaPods для установки библиотек Firebase. Однако, если вы предпочитаете не использовать CocoaPods, вы можете интегрировать фреймворки SDK напрямую или использовать бета-версию Swift Package Manager.
- Создайте файл Podfile, если у вас его ещё нет. Если вы используете пример быстрого запуска, проект Xcode и файл Podfile (с подами) уже присутствуют.
$ cd MessagingExample $ pod init
- В ваш Podfile добавьте модули Firebase, которые вы хотите использовать в своем приложении.
В ваше iOS-приложение можно добавить любой из поддерживаемых продуктов Firebase.
В пример быстрого запуска добавлены 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'
- Установите модули, затем откройте файл
.xcworkspace, чтобы увидеть проект в Xcode:
$ pod install
- Откройте файл
MessagingExample.xcworkspaceи нажмите «Далее» в консоли Firebase.
Инициализируйте Firebase в своем приложении.
Вам потребуется добавить в приложение код инициализации Firebase.
Импортируйте модуль Firebase и настройте общий экземпляр (в примере быстрого запуска модуль Firebase уже импортирован).
- Импортируйте модуль Firebase в ваш
UIApplicationDelegate:
AppDelegate.swift
import UIKit
import Firebase // Add this line
- Настройте общий экземпляр FirebaseApp, как правило, в методе `application
application:didFinishLaunchingWithOptions:` вашего приложения.
AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure() // Add this line
return true
}
- Нажмите кнопку «Далее» в консоли Firebase.

- SDK Firebase добавлены в ваше приложение. Нажмите «Продолжить» в консоли .

5. Настройка клиента FCM
Загрузите ключ аутентификации APNs.
Загрузите свой ключ аутентификации APNs в Firebase.
- В консоли Firebase внутри вашего проекта выберите значок шестеренки, затем выберите «Настройки проекта» и перейдите на вкладку «Облачные сообщения» .

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

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

Зарегистрируйтесь для получения удаленных уведомлений
Зарегистрируйте приложение для получения удаленных уведомлений либо при запуске, либо в желаемый момент работы приложения.
В примере для быстрого запуска 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
}
Для назначения свойства delegate классу 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
}
Для назначения свойства delegate объекта 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):
- Щелкните название проекта в области навигатора.
- Нажмите «Подписание и возможности» .
- Click + Возможность .

- Двойным щелчком мыши выберите «Режимы фона» .
- Нажмите «+ Возможность» еще раз.
- Двойным щелчком включить push-уведомления .
- В разделе «Фоновые режимы» установите флажок «Удаленные уведомления» .

6. Отправить уведомление
Вы можете отправить тестовое сообщение, выполнив следующие шаги:
- Установите и запустите приложение на целевом устройстве. Вам потребуется принять запрос на предоставление разрешения для получения удаленных уведомлений.
- Получите токен регистрации в журнале Xcode.

- Убедитесь, что приложение работает в фоновом режиме на устройстве.
- Откройте редактор уведомлений и выберите «Создать новое уведомление» .
- Введите текст сообщения.

- Выберите «Отправить тестовое сообщение» .
- В поле « Добавить регистрационный токен FCM» введите регистрационный токен, полученный на шаге 2.
- Нажмите «Тест» .
После нажатия кнопки «Тест» целевое клиентское устройство (с запущенным в фоновом режиме приложением) должно получить уведомление в центре уведомлений.
Для получения информации о доставке сообщений в ваше приложение, ознакомьтесь с панелью отчетов FCM , которая регистрирует количество отправленных и открытых сообщений на устройствах iOS и Android.

7. Поздравляем!
Поздравляем, вы успешно отправили тестовое сообщение!
В FCM есть множество других функций и настроек, таких как подписка на темы.
Если вас это интересует, ознакомьтесь с официальной документацией для разработчиков .
Что дальше?
Посмотрите некоторые из этих практических занятий по программированию.