Отправка push-уведомлений в приложение для iOS с помощью облачных сообщений Firebase
Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)
Продолжая нашу серию статей о Firebase, в этом посте мы рассмотрим Firebase Cloud Messaging - или для краткости FCM - Google сервис с малой задержкой и сервис оркестровки уведомлений для мобильных приложений. Пока iPhone существует, push-уведомления играли важную роль в уведомлении пользователей в заранее определенное время о важных событиях, будь то уведомление о сообщении Skype или звонке, прямое сообщение в Twitter или игровые оповещения. Посредством тщательно продуманных сегментированных push-уведомлений маркетологи увеличили вовлеченность приложений и удержание пользователей. Вы можете сделать то же самое, используя FCM для:
- целевые предопределенные или пользовательские сегменты пользователей, использующие преимущества демографии и поведения пользователей
- доставлять немедленные или запланированные push-уведомления
- интегрировать FCM в Google Analytics для обеспечения подробного мониторинга и проведения A/B-тестирования
- создать полностью погруженное приложение для обмена мгновенными сообщениями
Предполагаемые знания
В этом руководстве предполагается, что у вас есть практические знания по iOS и Swift, а также некоторый базовый опыт работы с CocoaPods. Если вам нужно узнать больше, ознакомьтесь с нашими руководствами по Swift и CocoaPods.
Цели этой статьи
В этой статье вы узнаете все о FCM, так как мы рассмотрим следующие темы:
- настройка проекта FCM
- настроим вашу среду для FCM
- будем получать и обрабатывать сообщения
- отправим сообщение на ваше устройство
- обмен сообщениями по темам и группам
- целевые сегменты и аналитика
Что такое Firebase Cloud Messaging (FCM)?
Вкратце, Firebase Cloud Messaging (или сокращенно FCM) - это кроссплатформенное решение для обмена облачными сообщениями и уведомлениями от Google, позволяющее разработчикам отправлять push-уведомления своим конечным пользователям приложений через Firebase Notification Composer или через набор API, предоставляемый Firebase. FCM поддерживает два типа сообщений: уведомления и сообщения с данными.



Уведомительные сообщения - это явные push-уведомления, которые отображаются на устройстве пользователя для информирования или запроса на участие, такие как уведомление в сообщении Facebook Messenger. Сообщения с данными, напротив, непосредственно обрабатываются приложением в фоновом режиме и могут использоваться для обновления табличного представления без приложения на переднем плане.
Посредством таргетинга сообщений FCM может доставлять сообщения на отдельные устройства, группы устройств или устройства, подписанные на темы. Целевые группы напрямую интегрируются с Firebase Analytics, так что вы можете отслеживать вовлечение и конверсии, создавая целевые сегменты клиентов. Далее мы собираемся пройти процесс настройки проекта Firebase для iOS.
Настройте проект
В этой серии мы собираемся создать простое приложение, которое мало что делает, кроме запуска и получения сообщений от FCM. Давайте начнем с клонирования проекта из GitHub:
1 |
$ git@github.com:doronkatz/get-started-with-fcm-for-ios.git
|
2 |
... |
3 |
$ git fetch --all --tags |
4 |
... |
5 |
$ git checkout tags/START
|
Открыв Podfile в корневом каталоге, вы заметили, что мы импортировали необходимые модули Firebase:
1 |
# Uncomment the next line to define a global platform for your project
|
2 |
platform :ios, '10.0' |
3 |
|
4 |
target 'Firebase-FCM' do |
5 |
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
|
6 |
use_frameworks!
|
7 |
|
8 |
# Pods for Firebase-FCM
|
9 |
pod 'Firebase/Core' |
10 |
pod 'Firebase/Messaging' |
11 |
end
|
Введите следующее, чтобы построить pods:
pod install
Откройте рабочее пространство Firebase-FCM.xcworkspace и в браузере перейдите на панель Firebase и создайте новый проект:



Затем нажмите «Добавить Firebase» в ваше приложение iOS, и шаг за шагом пройдите через процесс регистрации вашего приложения в Firebase.



В какой-то момент он просит вас добавить файл GoogleService-info.plist в ваш проект Xcode:



Вы уже добавили библиотеки через CocoaPods, так что вы можете пропустить оставшиеся инструкции и вернуться в консоль Firebase.
В Xcode откройте AppDelegate.swift, и вы увидите, что мы инициализировали проект, импортировав Firebase и добавив FirebaseApp.configure():
1 |
import UIKit |
2 |
import Firebase |
3 |
|
4 |
@UIApplicationMain |
5 |
class AppDelegate: UIResponder, UIApplicationDelegate {
|
6 |
|
7 |
*var* window: UIWindow? |
8 |
|
9 |
|
10 |
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
|
11 |
/// Override point for customization after application launch./ |
12 |
FirebaseApp.configure() |
13 |
return true |
14 |
} |
15 |
|
16 |
... |
Создайте и запустите приложение, чтобы убедиться в отсутствии ошибок, и, хотя приложение ничего не делает, оно запускает начальный вызов Firebase, подтверждая, что вы можете подключиться к облаку. Далее мы собираемся настроить наши APN.
Конфигурирование вашей среды для FCM
FCM использует службу Apple Push Notification (APN) для отправки и получения сообщений, поэтому нам нужно включить Push-уведомления через APN. Сначала на портале разработчиков Apple создайте ключ аутентификации.
Создайте ключ аутентификации APNs
Сначала перейдите в Сертификаты> Идентификаторы и профили и выберите Все под Ключами:



Теперь введите описание ключа для ключа авторизации APN, выбрав службу push-уведомлений Apple (APN). Храните этот ключ в надежном месте, так как это разовая загрузка.
Затем вам нужно создать идентификатор приложения, чтобы ваше приложение можно было идентифицировать. Выберите Идентификаторы > App IDs в меню навигации и нажмите кнопку +, чтобы добавить новый идентификатор приложения iOS. Введите описание и суффикс идентификатора приложения для вашего приложения в соответствии с тем, что есть в вашем проекте XCode. Убедитесь, что вы также выбрали Push-уведомления в поле службы.



Вернитесь на панель Firebase и в разделе Настройки проекта выберите вкладку Облачные сообщения. Под Аутентификационным ключом APN в конфигурации приложения iOS нажмите кнопку Загрузить. Теперь загрузите ключ авторизации APN, который вы загрузили с портала разработчиков Apple.



Авторизация Push-уведомлений в приложении
В вашем AppDelegate.swift добавьте следующий код:
1 |
import UserNotifications |
2 |
|
3 |
@UIApplicationMain |
4 |
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
|
5 |
|
6 |
var window: UIWindow? |
7 |
|
8 |
|
9 |
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
|
10 |
/// Override point for customization after application launch. |
11 |
FirebaseApp.configure() |
12 |
|
13 |
UNUserNotificationCenter.current().delegate = self |
14 |
|
15 |
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] |
16 |
|
17 |
UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { (_, error) in
|
18 |
guard error == nil else{
|
19 |
print(error!.localizedDescription) |
20 |
return |
21 |
} |
22 |
} |
23 |
|
24 |
application.registerForRemoteNotifications() |
25 |
return true |
26 |
} |
Здесь мы импортируем UserNotifications, объявляя о нашем намерении реализовать UNUserNotificationCenterDelegate и запрашивая разрешение пользователя на уведомления с помощью UNUserNotificationCenter.current().RequestAuthorization().
В дополнение к токену APN, который мы сгенерировали ранее, FCM также генерирует токен, который используется для нацеливания на определенные экземпляры приложения устройства через обмен messaging:didReceiveRegistrationToken:. Это извлекается во время запуска приложения, и токен обновляется всякий раз, когда он истекает или каким-то образом становится недействительным.
По-прежнему в нашем файле AppDelegate.swift добавьте следующее под объявлением FirebaseApp.configure():
1 |
class AppDelegate: UIResponder, UIApplicationDelegate {
|
2 |
|
3 |
var window: UIWindow? |
4 |
let gcmMessageIDKey = "gcm.message_id" |
5 |
|
6 |
|
7 |
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
|
8 |
// Override point for customization after application launch. |
9 |
FirebaseApp.configure() |
10 |
Messaging.messaging().delegate = self |
11 |
|
12 |
UNUserNotificationCenter.current().delegate = self |
13 |
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] |
14 |
... |
Обратите внимание, что мы также добавили MessagingDelegate в наше объявление класса. Токены извлекаются с помощью службы messaging:didReceiveRegistrationToken: и вызываются один раз в начале запуска приложения, а результаты отправляются на сервер приложений. Добавьте следующее в конец вашего метода didFinishLaunchingWithOptions:
1 |
//Solicit permission from the user to receive notifications |
2 |
UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { (_, error) in
|
3 |
guard error == nil else{
|
4 |
print(error!.localizedDescription) |
5 |
return |
6 |
} |
7 |
} |
8 |
|
9 |
//get application instance ID |
10 |
InstanceID.instanceID().instanceID { (result, error) in
|
11 |
if let error = error {
|
12 |
print("Error fetching remote instance ID: \(error)")
|
13 |
} else if let result = result {
|
14 |
print("Remote instance ID token: \(result.token)")
|
15 |
} |
16 |
} |
17 |
|
18 |
application.registerForRemoteNotifications() |
19 |
return true |
20 |
} |
Нам нужно явно попросить пользователя принять push-уведомления перед отправкой сообщений. Метод requestAuthorization(options: authOptions) делает именно это. Когда токен обновляется, ваше приложение получает уведомление с помощью следующего метода делегирования сообщений:
1 |
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
|
2 |
if let messageID = userInfo[gcmMessageIDKey] {
|
3 |
print("Message ID: \(messageID)")
|
4 |
} |
5 |
|
6 |
// Print full message. |
7 |
print(userInfo) |
8 |
} |
9 |
|
10 |
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
|
11 |
print("Unable to register for remote notifications: \(error.localizedDescription)")
|
12 |
} |
Последний метод позволяет вам получать сообщения на переднем плане, напрямую от FCM, чтобы обойти наш прокси-сервер APN. Далее мы работаем над обработкой Push-уведомлений.
Получение и обработка сообщений
Чтобы получать уведомления, нам нужно зарегистрироваться для получения уведомлений. Когда ваше приложение находится в фоновом режиме, ваши уведомления доставляются в системный трей до тех пор, пока ваше приложение не откроется, после чего пакет уведомлений затем передается обратному вызову didReceiveRemoteNotification: в AppDelegate. Давайте реализуем это следующим образом:
1 |
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
|
2 |
print("Firebase registration token: \(fcmToken)")
|
3 |
|
4 |
let dataDict:[String: String] = ["token": fcmToken] |
5 |
NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
|
6 |
// TODO: If necessary send token to application server. |
7 |
// Note: This callback is fired at each app startup and whenever a new token is generated. |
8 |
} |
9 |
|
10 |
func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
|
11 |
print("Received data message: \(remoteMessage.appData)")
|
12 |
} |
Проверка получения токена регистрации Firebase
Создайте и запустите свое приложение, убедившись, что оно запущено на вашем физическом устройстве, поскольку вы не можете получать push-уведомления на симуляторе. Прямо сейчас приложение ничего не делает визуально, но если вы обратите внимание на консоль Xcode, вы должны увидеть, что вы успешно получили идентификатор токена регистрации Firebase:



Теперь мы готовы перейти к последнему этапу, отправляя сообщения в наше приложение.
Отправка сообщения на ваше устройство
На предыдущем шаге мы должны были успешно запустить наше приложение без сообщений об ошибках в нашей консоли. Создайте и снова запустите свое приложение в XCode, но убедитесь, что ваше приложение находится в фоновом режиме, в то время как процесс запуска XCode все еще выполняется, проведя пальцем вверх, чтобы перейти на домашний экран.
Мы собираемся создать сообщение с помощью конструктора уведомлений Firebase, поэтому зайдите туда в браузере и введите образец текста. Убедитесь, что вы выбрали одно устройство для своей цели сообщения.



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



Тема и групповые сообщения
В этом учебном пособии вы узнали о том, как получать push-уведомления с использованием FCM, но мы лишь слегка коснулись того, что мы можем сделать с помощью FCM. В нашем примере мы нацелены на одно устройство, вы, скорее всего, нацеливаетесь на устройства, подписывающиеся на определенные группы или которые следят за конкретными темами.
Обмен сообщениями в темах позволяет пользователям подписываться на определенные темы, такие как результаты матчей вашей любимой команды колледжа или обновления погоды в соответствии с интересами вашего пользователя. Пользователи могут подписаться на неограниченное количество тем с FCM, оптимизируя сообщения для пропускной способности, а не задержки. Для получения дополнительной информации о работе с тематическими сообщениями, пожалуйста, обратитесь к разделу «Обмен сообщениями по темам на iOS» в документации Firebase.
Если вы хотите отправлять сообщения на несколько устройств для каждого пользователя, таких как iPhone и iPad пользователя, обмен сообщениями между группами будет более подходящим для вас. Обмен сообщениями между группами устройств позволяет отправлять одно сообщение нескольким экземплярам приложения, работающего на устройствах, принадлежащих группе. (Сообщения группы устройств на iOS), где группа обычно означает одного пользователя с набором связанных устройств, совместно использующих общий ключ уведомления FCM.
Для любого типа обмена сообщениями вместо использования конструктора уведомлений вы должны использовать более автоматизированную и сложную форму запуска сообщений с использованием Firebase Admin SDK.
Целевые сегменты и аналитика
Помимо отправки сообщений по темам и группам, вы также можете тщательно ориентировать сегменты пользователей на основе различных других маркетинговых свойств. То есть вы можете использовать FCM для проведения А/B или других типов экспериментов, чтобы вы могли оценивать и проверять гипотезы и наблюдать ключевые показатели взаимодействия.
A/B-тестирование работает с FCM, поэтому вы можете тестировать различные маркетинговые сообщения, а с помощью Remote Config - тестировать изменения в своем приложении. (Firebase)
Для получения дополнительной информации обратитесь к документации Firebase по Firebase A/B тестированию.
Вы можете скачать полный исходный код этого проекта, клонировав демо-версию приложения push-уведомлений Firebase iOS из нашей учетной записи GitHub.
Заключение
В этом учебном пособии вы узнали о Firebase Cloud Messaging и о том, как вы можете легко вывести свое приложение iOS на новый уровень, используя push-уведомления в качестве средства привлечения пользователей. FCM предоставляет вашему приложению не только способ общения со своими пользователями, но и предоставляет вам эффективный способ применения сложных маркетинговых стратегий для отправки сообщений нужным пользователям в нужное время на основе различных алгоритмов, которые вы можете создать. FCM чрезвычайно прост в реализации, но обеспечивает непревзойденный уровень сложности и расширяемости на рынке.



