Firebase Cloud Messaging (FCM) — to wieloplatformowa usługa dostarczania powiadomień push i komunikatów od Google, przeznaczona dla aplikacji mobilnych i internetowych. FCM zapewnia niezawodne przesyłanie danych między serwerem a urządzeniami klienckimi bez konieczności utrzymywania stałego połączenia sieciowego. Według Firebase Documentation, 2026, przez infrastrukturę FCM codziennie przechodzi ponad 300 miliardów wiadomości na całym świecie. Usługa obsługuje zarówno powiadomienia z automatycznym wyświetlaniem, jak i komunikaty data do ukrytego przesyłania danych w tle.
Najważniejsze
Firebase Cloud Messaging — to chmurowa usługa Google, która zapewnia przesyłanie powiadomień push i wiadomości data między serwerem aplikacji a urządzeniami klienckimi. Usługa zastąpiła przestarzały Google Cloud Messaging (GCM) i stała się standardowym rozwiązaniem do dostarczania push w ekosystemie Firebase. FCM obsługuje Android, iOS, Web i Unity, zapewniając jednolity interfejs wysyłania niezależnie od docelowej platformy.
Usługa udostępnia kilka mechanizmów dostarczania wiadomości, z których każdy rozwiązuje swoje zadanie. Wiadomości notification są wyświetlane przez system automatycznie po otrzymaniu — programista nie musi pisać kodu do pokazywania powiadomienia. Wiadomości data przesyłają dowolny payload w postaci par klucz-wartość i są przetwarzane wewnątrz aplikacji. Wiadomości kombinowane zawierają jednocześnie widoczną i ukrytą część dla maksymalnej elastyczności.
Implementacja własnego serwera push wymaga ciągłego utrzymywania połączenia TCP z każdym urządzeniem, co jest nieefektywne i niebezpieczne. FCM wykorzystuje jednolitą infrastrukturę Google, która utrzymuje połączenie z miliardami urządzeń jednocześnie. Usługa automatycznie zarządza ponownymi próbami dostarczenia, kolejkami wiadomości i równoważeniem obciążenia, uwalniając programistę od konieczności rozwiązywania tych zadań samodzielnie.
Architektura FCM składa się z trzech kluczowych komponentów: serwera dostawcy (twój backend), serwera Firebase Cloud Messaging i aplikacji klienckiej na urządzeniu. Gdy serwer wysyła wiadomość, trafia ona najpierw do infrastruktury FCM, która kieruje ją na docelowe urządzenie. Jeśli urządzenie jest offline, FCM przechowuje wiadomość w kolejce i dostarcza ją po przywróceniu połączenia.
Przy pierwszym uruchomieniu aplikacja wywołuje Firebase SDK, który rejestruje urządzenie w usłudze FCM i otrzymuje unikalny Registration Token. Token ten to ciąg o długości około 150 znaków, identyfikujący konkretną instancję aplikacji na konkretnym urządzeniu. Token może się zmieniać przy ponownej instalacji aplikacji, czyszczeniu danych lub przywracaniu z kopii zapasowej — programista powinien obsługiwać aktualizację tokena przez delegata onNewToken.
Gdy serwer wysyła żądanie przez FCM API, wiadomość przechodzi przez kilka etapów. Przyjęcie i walidacja — FCM sprawdza poprawność żądania i istnienie docelowego urządzenia. Kolejka — jeśli urządzenie jest niedostępne, wiadomość trafia do kolejki przechowywania. Kierowanie — FCM określa optymalny kanał dostarczenia (Wi-Fi lub dane komórkowe). Dostarczenie — system przekazuje wiadomość do docelowej aplikacji. Po pomyślnym dostarczeniu FCM zwraca serwerowi identyfikator wiadomości.
Firebase Cloud Messaging obsługuje trzy typy wiadomości, z których każdy ma swoje cechy przetwarzania po stronie klienta. Wiadomości notification są przetwarzane przez systemową usługę Google Play Services w Android i APNs w iOS i automatycznie wyświetlane jako banery push. Wiadomości data są przekazywane bezpośrednio do aplikacji i przetwarzane przez callback onMessageReceived w Android i application(_:didReceiveRemoteNotification:) w iOS.
Wiadomość notification zawiera predefiniowane pola: title, body, URL obrazu i dźwięk powiadomienia. System automatycznie tworzy i wyświetla powiadomienie w zasobniku systemowym, nawet jeśli aplikacja jest w tle lub zabita. Użytkownik widzi standardowy baner z tytułem i tekstem, a po kliknięciu aplikacja otwiera się z danymi przekazanymi w payload. Jeśli aplikacja jest aktywna, wiadomość notification można przechwycić i przetworzyć w kodzie.
Wiadomość data to niestandardowy zbiór par klucz-wartość bez predefiniowanych pól. Payload nie jest przetwarzany przez system automatycznie — aplikacja otrzymuje surowe dane i może je interpretować w dowolny sposób. Wiadomości data są używane do synchronizacji danych w tle, aktualizacji lokalnego cache, wyzwalania synchronizacji lub przesyłania poleceń bez wyświetlania powiadomienia. W Android wiadomość data jest dostarczana zawsze, nawet jeśli aplikacja jest zabita lub w tle.
FCM pozwala wysyłać wiadomość, która zawiera jednocześnie część notification (do wyświetlenia) i część data (do przetworzenia). Kombinowany payload obejmuje zarówno predefiniowane pola notification, jak i dowolne klucze data. System wyświetla powiadomienie z części notification, a część data jest przekazywana w intent extras aplikacji przy otwarciu. Jest to wygodne w scenariuszach, gdzie trzeba pokazać użytkownikowi powiadomienie i jednocześnie przekazać kontekst do przejścia na konkretny ekran.
| Typ | Auto-wyświetlanie | Przetwarzanie w tle | Przykład |
|---|---|---|---|
| Notification | Tak, przez system | Automatycznie, bez kodu | Powitalne powiadomienie push |
| Data | Nie | Przez callback aplikacji | Synchronizacja danych w tle |
| Kombinowane | Tak, część notification | Część data przy otwarciu | Powiadomienie + link do zamówienia |
Integracja FCM w Android rozpoczyna się od podłączenia Firebase SDK przez plik build.gradle na poziomie aplikacji. Po dodaniu zależności i pliku google-services.json aplikacja automatycznie otrzymuje Registration Token, który jest przekazywany przez callback FirebaseMessagingService. Do odbierania powiadomień należy utworzyć serwis dziedziczący po FirebaseMessagingService i zarejestrować go w AndroidManifest.xml.
Po podłączeniu SDK Firebase automatycznie generuje token urządzenia bez dodatkowego kodu. Token jest dostępny przez FirebaseMessaging.getInstance().token, który zwraca Task
class MyFirebaseMessagingService :
FirebaseMessagingService() {
override fun onNewToken(token: String) {
sendTokenToServer(token)
}
override fun onMessageReceived(
message: RemoteMessage
) {
val data = message.data
val title = "Nowa wiadomość"
val body = data["body"] ?: ""
showNotification(title, body)
}
}
Serwis do odbierania wiadomości FCM należy zarejestrować w AndroidManifest.xml z odpowiednimi intent-filter. Dodanie znacznika service z uprawnieniem INTERNET i wskazaniem action. Bez rejestracji serwisu wiadomości nie będą dostarczane do aplikacji w tle. Do wyświetlania powiadomień w Android 13+ wymagane jest runtime-zezwolenie POST_NOTIFICATIONS.
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name=
"android.permission.POST_NOTIFICATIONS" />
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name=
"com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
Integracja FCM w iOS wymaga konfiguracji zarówno po stronie Apple Push Notification Service (APNs), jak i w Firebase Console. W przeciwieństwie do Androida, gdzie FCM zarządza połączeniem bezpośrednio, w iOS FCM wykorzystuje APNs jako warstwę transportową. Aplikacja rejestruje się do otrzymywania powiadomień push przez UIApplication.shared.registerForRemoteNotifications, a Firebase SDK przechwytuje otrzymany device token i łączy go z FCM Registration Token.
Do działania FCM w iOS należy przesłać klucz APNs lub certyfikat w Firebase Console. Klucz APNs — to nowoczesny sposób uwierzytelniania bez certyfikatów (zalecany przez Apple). Klucz tworzy się w Apple Developer Portal w sekcji Keys i przesyła w ustawieniach Cloud Messaging w Firebase Console. Po konfiguracji APNs aplikacja żąda uprawnienia do powiadomień przez UNUserNotificationCenter i rejestruje się przez APNs.
import Firebase
import UserNotifications
class AppDelegate: NSObject, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions
launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FirebaseApp.configure()
UNUserNotificationCenter.current()
.requestAuthorization(options: [.alert, .sound, .badge])
application.registerForRemoteNotifications()
return true
}
func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken
deviceToken: Data
) {
Messaging.messaging()
.apnsToken = deviceToken
}
}
Do obsługi otrzymanych powiadomień implementuje się delegata UNUserNotificationCenter. Metoda willPresent jest wywoływana, gdy powiadomienie zostanie odebrane przy aktywnej aplikacji — tutaj można pokazać niestandardową notyfikację in-app lub zignorować systemowy baner. Metoda didReceive jest wywoływana, gdy użytkownik kliknie powiadomienie — tutaj wykonuje się przejście na odpowiedni ekran. Dla wiadomości data używany jest delegat MessagingDelegate, który otrzymuje payload przy odebraniu wiadomości FCM w tle.
Wysyłanie serwerowe wiadomości FCM odbywa się przez HTTP v1 API Firebase Cloud Messaging lub przestarzałe Firebase Cloud Messaging API. HTTP v1 API jest zalecanym sposobem, wykorzystuje uwierzytelnianie OAuth 2.0 przez Service Account i obsługuje wszystkie nowoczesne możliwości FCM, w tym analitykę dostarczania i testy A/B powiadomień. Żądanie wysyłane jest metodą POST na endpoint https://fcm.googleapis.com/v1/projects/{project_id}/messages:send.
Treść żądania zawiera obiekt JSON z informacjami o wiadomości: target (token, temat lub warunek), notification (do wyświetlenia) i data (niestandardowy payload). Uwierzytelnianie przez klucz JSON Service Account, który jest ładowany do zmiennych środowiskowych serwera. Token dostępu jest generowany przez bibliotekę google-auth-library. Google zaleca używanie Firebase Admin SDK do automatycznego zarządzania uwierzytelnianiem i ponownymi próbami.
const admin = require("firebase-admin")
const serviceAccount = require("./serviceAccountKey.json")
admin.initializeApp({ credential: admin.credential.cert(serviceAccount) })
const message = {
token: "device_registration_token",
notification: { title: "Zniżka 20%", body: "Na wszystkie usługi dzisiaj" },
data: { screen: "promo", promoId: "324" },
android: { priority: "high" },
apns: { payload: { aps: { sound: "default" } } }
}
admin.messaging().send(message)
.then(response => {
console.log("Pomyślnie wysłano:", response)
})
.catch(error => {
console.log("Błąd wysyłania:", error)
})
Do wysyłania powiadomień do grupy użytkowników FCM obsługuje subskrypcję tematów. Temat (topic) — to nazwany kanał, na który aplikacja kliencka subskrybuje przez FirebaseMessaging.getInstance().subscribeToTopic(). Serwer może wysłać wiadomość na temat, a zostanie ona dostarczona do wszystkich subskrybujących urządzeń. Tematy nadają się do newsletterów, powiadomień o promocjach i eventowych push. Do bardziej precyzyjnej segmentacji używa się warunków (conditions) opartych na wielu tematach z operatorami logicznymi.
Często zadawane pytania
FCM działa w Android poprzez własną infrastrukturę Google, a w iOS wykorzystuje APNs jako protokół transportowy. FCM zapewnia jednolity API dla obu platform, automatyczne przechowywanie wiadomości offline i analitykę dostarczania, czego nie ma w czystym APNs.
Tak, przez Firebase Console w sekcji Cloud Messaging można ręcznie wysyłać powiadomienia na wybrane urządzenia, tematy lub segmenty odbiorców. Funkcja nadaje się do testowania i jednorazowych wysyłek, ale nie zastępuje integracji serwerowej dla aplikacji produkcyjnych.
Zasubskrybuj aktualizacje tokena przez onNewToken w FirebaseMessagingService (Android) lub MessagingDelegate (iOS). Po zmianie tokena wyślij nowy token na serwer i usuń stary. Serwer powinien zaktualizować bazę danych i zaprzestać prób wysyłania na nieaktualny token.
FCM przechowuje wiadomość w kolejce do 28 dni i dostarcza ją po przywróceniu połączenia. Dla wiadomości notification kolapsowana jest tylko ostatnia wiadomość dla każdej grupy kolapsacji. Wiadomości data są przechowywane osobno i dostarczane w kolejności wysyłania bez kolapsacji.
FCM jest całkowicie darmowy bez ograniczeń na liczbę wiadomości. Korzystanie z FCM nie jest taryfikowane ani w ramach planu Spark, ani w planie Blaze. Ograniczenia dotyczą tylko rozmiaru payload: do 4 KB dla wiadomości notification i do 2 KB dla wiadomości data.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również