FCM relies on the following set of components that build, transport, and receive messages:
-
Tooling to compose or build message requests. The Notifications composer provides a GUI-based option for creating notification requests. For full automation and support for all message types , you must build message requests in a trusted server environment that supports the Firebase Admin SDK or the FCM server protocol. This environment could be Cloud Functions for Firebase, App Engine, or your own app server.
-
The FCM backend, which (among other functions) accepts message requests, performs fanout of messages via topics, and generates message metadata such as the message ID.
-
A platform-level transport layer, which routes the message to the targeted device, handles message delivery, and applies platform-specific configuration where appropriate. This transport layer includes:
- Android transport layer (ATL) for Android devices with Google Play services
- Apple Push Notification service (APNs) for Apple devices
-
Web push protocol for web apps
-
The FCM SDK on the user’s device, where the notification is displayed or the message is handled according to the app’s foreground/background state and any relevant application logic.
Lifecycle flow
- Register devices to receive messages from FCM. An instance of a client app registers to receive messages, obtaining a registration token that uniquely identifies the app instance.
- Send and receive downstream messages.
- Send a message. The app server sends messages to the client app:
- The message is composed, either in the Notifications composer or a trusted environment, and a message request is sent to the FCM backend.
- The FCM backend receives the message request, generates a message ID and other metadata, and sends it to the platform specific transport layer.
- When the device is online, the message is sent via the platform-specific transport layer to the device.
- On the device, the client app receives the message or notification.
- Send a message. The app server sends messages to the client app: