FCM (Firebase Cloud Messaging) е междуплатформена услуга на Google за доставяне на push известия и прехвърляне на данни между сървър и мобилни приложения. Тя поддържа Android, iOS и уеб платформи чрез единен API. Според Firebase Documentation, FCM обработва над 1 милиард съобщения дневно по целия свят.
Основни точки
Firebase Cloud Messaging (FCM) е облачна услуга на Google, която осигурява надеждно доставяне на push известия и съобщения с данни на мобилни устройства. Преди позната като Google Cloud Messaging (GCM), FCM се превърна в основния инструмент за междуплатформени известия в екосистемата на Firebase.
FCM автоматично избира оптималния канал за доставка в зависимост от платформата: на Android използва собствена FCM връзка, на iOS — APNS (през FCM шлюз). Разработчикът не трябва да имплементира две различни интеграции — FCM поема маршрутизацията.
Услугата предоставя единен REST API и Admin SDK за изпращане на съобщения. Това позволява изпращане на известия от сървърната страна без обвързване с конкретна платформа на получателя.
FCM поддържа няколко режима на доставка: едно съобщение до конкретно устройство, групово изпращане по тема (topic) и сегментно изпращане по условия (condition). Също така са налични планиране на изпращането и A/B тестване на съдържанието на известията.
Архитектурата на FCM се основава на три компонента: клиентско приложение, Firebase Connection Server и сървър на приложението (app server). Клиентът се регистрира в FCM при стартиране и получава уникален регистрационен токен — низ, който идентифицира устройството за дадено приложение.
Сървърът на приложението изпраща заявка към FCM REST API, посочвайки токена на получателя или темата. Firebase Connection Server доставя съобщението, използвайки постоянна XMPP връзка или HTTP заявка. Ако устройството е офлайн — съобщението се поставя на опашка и се доставя при възстановяване на връзката.
FCM гарантира доставка с помощта на приоритетни опашки и механизъм за потвърждение на получаването. На Android съобщението се съхранява до 28 дни на опашка, на iOS — до 4 седмици (чрез APNS). След изтичане на срока съобщението се изтрива без уведомление.
Регистрационният токен може да се промени в няколко случая: при възстановяване на данните на приложението, при обновяване до нова версия или при изчистване на кеша. Приложението трябва да имплементира FirebaseMessagingService.onNewToken за обработка на обновяването на токена и синхронизация със сървъра.
FCM поддържа два типа полезен товар: notification и data. Всеки тип определя как и кога съобщението се обработва на устройството на получателя.
| Параметър | Notification | Data |
|---|---|---|
| Автоматично показване | Да, ако приложението е на заден план | Не, само в приложението |
| Обработка | Система — на заден план; приложение — на преден план | Винаги в приложението (onMessageReceived) |
| Максимален размер | 4 KB | 4 KB |
| Персонализирани ключове | Ограничени до предварително определени полета | Произволни двойки ключ-стойност |
| Изисква CollapseKey | По избор | По избор за групиране |
На практика се препоръчва използването на data съобщения, ако приложението се нуждае от пълна обработка на известието в onMessageReceived. Notification съобщенията са подходящи за прости сценарии, където системното показване е достатъчно.
FCM и APNS са двете основни услуги за push доставка. FCM работи като междуплатформен шлюз, APNS — само за екосистемата на Apple. Техните основни разлики са в архитектурата, изискванията за сертификати и механизмите за маршрутизация.
Изборът между FCM и директен APNS зависи от архитектурата на проекта. За междуплатформени приложения FCM е оптималният избор. За проекти само с iOS е приемлива директна работа с APNS чрез HTTP/2 API.
FCM е оправдан, когато проектът използва едновременно Android и iOS, както и при нужда от Firebase аналитика, A/B тестване на известия или теми без сървърна логика. Директният APNS е предпочитан за приложения само с iOS с минимални зависимости и строги изисквания за забавяне на доставката.
За свързване на FCM с Android приложение трябва да добавите Firebase SDK и да конфигурирате google-services.json в корена на проекта. След регистрация на токена приложението е готово да приема съобщения чрез FirebaseMessagingService.
// build.gradle (Module)
dependencies {
implementation("com.google.firebase:firebase-messaging:24.1.0")
}
// AndroidManifest.xml
<service android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
class MyFirebaseMessagingService :
FirebaseMessagingService() {
override fun onNewToken(token: String) {
sendTokenToServer(token)
}
override fun onMessageReceived(message: RemoteMessage) {
message.notification?.let {
showNotification(it.title, it.body)
}
}
}
След конфигурация приложението автоматично получава FCM токен при първото стартиране. Токенът трябва да бъде изпратен на сървъра на приложението за последващо изпращане на известия към това устройство.
На Android 8+ преди изпращане на FCM известие с автоматично показване трябва да се създаде NotificationChannel. FCM notification съобщенията използват канала с идентификатор по подразбиране, но се препоръчва създаване на собствен канал чрез FirebaseMessagingService при получаване на първото съобщение. Data съобщенията не изискват канал — приложението само решава как и кога да покаже известието.
На iOS FCM действа като посредник между сървъра на приложението и APNS. Firebase получава съобщението от сървъра, опакова го в APNS формат и го изпраща през Apple шлюза. Разработчикът трябва да конфигурира APNS ключ или сертификат в конзолата на Firebase.
import FirebaseMessaging
import UserNotifications
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FirebaseApp.configure()
UNUserNotificationCenter.current().delegate = self
Messaging.messaging().delegate = self
return true
}
}
extension AppDelegate: MessagingDelegate {
func messaging(
_ messaging: Messaging,
didReceiveRegistrationToken fcmToken: String?
) {
UserDefaults.standard.set(fcmToken, forKey: "fcm_token")
}
}
На iOS регистрацията в APNS се извършва асинхронно. FCM SDK автоматично получава APNS токен и го предава на Firebase сървъра. didReceiveRegistrationToken се задейства при получаване на нов FCM токен, който комбинира APNS токена с идентификатора на проекта.
FCM предоставя конзола Firebase за мониторинг на доставката: брой изпратени, получени и показани известия. Също така е налично обратно повикване за статус чрез Firebase Cloud Functions за проследяване на грешки при доставка от страна на сървъра. Ключови метрики: impressions (показвания) и opens (отваряния).
При работа с FCM е важно да изберете правилния тип съобщение за всеки сценарий. За прости известия с автоматично показване използвайте notification съобщения. За случаи, когато приложението трябва да обработи данни преди показване — data съобщения. Смесеният тип (notification + data) се препоръчва само ако данните са необходими за аналитика, а не за промяна на съдържанието на известието.
Управлявайте токените централизирано. Съхранявайте актуалните токени на сървъра в таблица с връзка към потребителя и платформата. Имплементирайте механизъм за почистване на остарели токени: при грешка NotRegistered или InvalidRegistration, премахнете токена от базата данни. Токените се променят рядко, но тяхното почистване е задължителна част от поддръжката на FCM.
Използвайте колапс ключове (collapseKey) за групиране на съобщения. Ако изпращате няколко известия от един и същи тип (например „актуализация на валутен курс”), задайте същия collapseKey. FCM ще достави само последното съобщение от групата, което намалява натоварването на устройството и не дразни потребителя с поток от известия.
Проследявайте доставката чрез Firebase Console и Cloud Functions. Аналитиката на FCM показва броя на изпратените, получените и показаните известия. Ако процентът на показване е под 70% — проверете настройките на каналите на Android и разрешенията на iOS. Ниската доставка често е свързана с изключени канали или забрана на известия. Пето: използвайте A/B тестване на Firebase за оптимизиране на текста на известията и времето за изпращане — това увеличава конверсията на отваряния с 15–25% според данните на Firebase.
Често задавани въпроси
FCM е еволюционна актуализация на GCM (Google Cloud Messaging). FCM предлага опростена конфигурация чрез Firebase Console, вградена аналитика, теми и поддръжка на Web Push. GCM беше официално изключен от април 2019 г., всички проекти трябва да бъдат мигрирани към FCM.
Firebase Cloud Messaging е безплатна услуга без ограничения на броя съобщения. Такса се начислява само за използване на други услуги на Firebase, като Cloud Functions или Firestore. FCM не изисква абонамент Spark или Blaze за основно изпращане на известия.
FCM токенът се променя при: възстановяване на приложението от резервно копие, изчистване на данните на приложението, преинсталиране, обновяване до нова версия с промяна на Sender ID. Винаги обработвайте onNewToken в FirebaseMessagingService за изпращане на новия токен към сървъра.
Google FCM е блокиран на територията на Китай. За доставяне на известия в Китай се използват алтернативни услуги: Huawei Push Kit, MiPush (Xiaomi), Oppo Push, Vivo Push. За междуплатформено доставяне се прилагат мулти-доставчикови услуги като Getui.
Използвайте вградената конзола Firebase: изберете „Cloud Messaging” — „Send Test Message”. Въведете тестов токен и изпратете notification съобщение. На устройството трябва да се появи известие. Можете също да наблюдавате логовете на FirebaseMessagingService.onMessageReceived.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също