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

1. Введение

Последнее обновление: 06.01.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
  • Протокол веб-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

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

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

  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. Значение поля Identifier должно совпадать с результатом объединения значений Team ID и Bundle ID.
  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 для подключения к вашему iOS-приложению. Подробнее о проектах Firebase можно узнать в разделе «Понимание проектов Firebase».

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

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

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

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

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

При появлении запроса выберите, использовать ли существующую учетную запись Google Analytics или создать новую. Если вы выберете создание новой учетной записи, выберите место хранения отчетов 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

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

Закройте Xcode.

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

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

  1. Создайте файл Podfile, если у вас его ещё нет. Если вы используете пример быстрого запуска, проект Xcode и файл Podfile (с подами) уже присутствуют.
$ cd MessagingExample
$ pod init
  1. В ваш 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'
  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 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. SDK Firebase добавлены в ваше приложение. Нажмите «Продолжить» в консоли . 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
}

Для назначения свойства 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):

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

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 есть множество других функций и настроек, таких как подписка на темы.

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

Что дальше?

Посмотрите некоторые из этих практических занятий по программированию.

Дополнительная информация