Firebase Cloud Messaging
Здесь находится гайд по подключению и локализации пуш-уведомлений с помощью Firebase. Гайд написан со стороны iOS разработчика, поэтому некоторые ссылки могут вести на специализированные ресурсы для Apple.
Добавляем Firebase в проект
Вы можете получать уведомления (push notifications) и полезные данные размером до 4000 байт через интерфейс APN Firebase Cloud Messaging.
Инструкция:
- Создайте проект Firebase
- Зарегистрируйте свое приложение в Firebase
- Добавьте файл конфигурации (Google plist) в проект
- Добавьте SDK Firebase в свое приложение
- Инициализируйте Firebase в своем приложении
- Загрузите ключ аутентификации APNs в Firebase. Если у вас нет ключа, создайте его в своем Apple Developer Member Center. Будьте осторожны, скачать созданную версию APNs ключа разрешается только один раз (замена - только через перегенерацию ключа).
Базовая настройка внутри проекта
- Запустите конфигурацию Firebase на старте проекта (внутри вашего
AppDelegate
) Можете сразу установить ваш сервис как делегата обмена сообщениями (Messaging
). Например:PushService
, реализованный черезSingleton
.
import UIKit
import Firebase
import FirebaseMessaging
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate {
let pushService = PushService.shared
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
setupFirebase()
return true
}
...
private func setupFirebase() {
FirebaseApp.configure()
Messaging.messaging().delegate = pushService
}
}
- Зарегистрируйтесь для получения уведомлений (внутри сервиса, где вы с ними работаете).
Не забудьте унаследовать сервис от
UNUserNotificationCenterDelegate
и внутри установить делегат.
import UIKit
import FirebaseMessaging
import Firebase
class PushService: NSObject, UNUserNotificationCenterDelegate {
func setup(
for application: UIApplication
) {
UNUserNotificationCenter.current().delegate = self
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(
options: authOptions,
completionHandler: { _,_ in })
application.registerForRemoteNotifications()
}
}
- Вызовите установку сервиса после авторизации пользователя.
Например:MainViewController
, в который мы попадаем после любой успешной авторизации в приложении.
class MainViewController: UIViewController {
...
override func viewDidLoad() {
super.viewDidLoad()
setupFirebase()
}
...
private func setupFirebase() {
pushService.setup(for: UIApplication.shared.self)
pushService.sendPushToken() // Отправка свежего токена на backend
}
}
Локализация пушей
Для того, чтобы локализовать Firebase пуши:
- Ваш сервер должен отправлять не
title_key
,body_key
, аbody_loc_key
,title_loc_key
- После этого локализация title (заголовок) и body (сообщение) подтягивается из файла локализации Localizable English / Russian
- Для автоматизации вам нужно согласовать с бэком ключи для ваших уведомлений (Например: BeforeStart, RemoveEvent и т.д.)
body_loc_key - string
The key to the body string in the app's string resources to use to localize the body text to the user's current localization.
title_loc_key - string
The key to the title string in the app's string resources to use to localize the title text to the user's current localization.
Ознакомьтесь с развернутой информацией по возможным действиям с контентом ваших пуш-уведомлений.
Неочевидные моменты при реализации протокола UNUserNotificationCenterDelegate
Протокол содержит два метода, которые используются для обработки входящих push-уведомлений:
- Приложение находится на переднем плане:
userNotificationCenter(_:willPresent:withCompletionHandler:)
- Приложение находится в фоне или на переднем плане и пользователь нажимает на push-уведомление:
userNotificationCenter(_:didReceive:withCompletionHandler:)
Неочевидный момент в том, что после реализации обоих этих методов протокола и если реализован метод application(:didReceiveRemoteNotification:) в AppDelegate, то он больше не будет вызываться. Если реализовать только один из методов протокола, то метод application(:didReceiveRemoteNotification:) вызываться будет. Что следует знать об этом методе:
- Это самый старый из методов обработки push-уведомлений.
- Он был признан устаревшим на iOS 10 и выше.
- Его использование ограничено, поэтому вместо него следует использовать фреймворк UserNotifications.
Полезные ресурсы
- Официальный пример реализации push-уведомлений от Firebase. Firebase Messaging Quickstart iOS
- Статья про принудительный сброс FCM токена
- Отправка тестового уведомления
- Отправка изображений в уведомлениях
- Получение сообщений и их обработка
- Документация Apple по User Notifications
- Примеры приложений
- Контрольный чеклист запуска Firebase
- FAQ по неполадкам для iOS
- FAQ по неполадкам для Android
- Тестирование пушей через Postman