Skip to main content

Firebase Cloud Messaging

Здесь находится гайд по подключению и локализации пуш-уведомлений с помощью Firebase. Гайд написан со стороны iOS разработчика, поэтому некоторые ссылки могут вести на специализированные ресурсы для Apple.

Добавляем Firebase в проект

Вы можете получать уведомления (push notifications) и полезные данные размером до 4000 байт через интерфейс APN Firebase Cloud Messaging.

Инструкция:

  1. Создайте проект Firebase
  2. Зарегистрируйте свое приложение в Firebase
  3. Добавьте файл конфигурации (Google plist) в проект
  4. Добавьте SDK Firebase в свое приложение
  5. Инициализируйте Firebase в своем приложении
  6. Загрузите ключ аутентификации APNs в Firebase. Если у вас нет ключа, создайте его в своем Apple Developer Member Center. Будьте осторожны, скачать созданную версию APNs ключа разрешается только один раз (замена - только через перегенерацию ключа).

Базовая настройка внутри проекта

  1. Запустите конфигурацию 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
}
}
  1. Зарегистрируйтесь для получения уведомлений (внутри сервиса, где вы с ними работаете). Не забудьте унаследовать сервис от 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()
}
}
  1. Вызовите установку сервиса после авторизации пользователя.
    Например: 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-уведомлений:

  1. Приложение находится на переднем плане:
userNotificationCenter(_:willPresent:withCompletionHandler:)
  1. Приложение находится в фоне или на переднем плане и пользователь нажимает на push-уведомление:
userNotificationCenter(_:didReceive:withCompletionHandler:)

Неочевидный момент в том, что после реализации обоих этих методов протокола и если реализован метод application(:didReceiveRemoteNotification:) в AppDelegate, то он больше не будет вызываться. Если реализовать только один из методов протокола, то метод application(:didReceiveRemoteNotification:) вызываться будет. Что следует знать об этом методе:

  • Это самый старый из методов обработки push-уведомлений.
  • Он был признан устаревшим на iOS 10 и выше.
  • Его использование ограничено, поэтому вместо него следует использовать фреймворк UserNotifications.

Полезные ресурсы

Автор: @EvelDevel