| Sélectionnez une plate-forme : | iOS+ Android Web Flutter Unity C++ |
Ce guide explique comment commencer à utiliser Firebase Cloud Messaging dans vos applications clientes Android afin de pouvoir envoyer des messages de manière fiable.
FCM clients nécessitent des appareils équipés d'Android 6.0 ou version ultérieure, sur lesquels l'application Google Play Store est installée, ou un émulateur exécutant Android 6.0 avec les API Google. Notez que vous n'êtes pas limité au déploiement de vos applications Android via le Google Play Store.
Configurer le SDK
Si ce n'est pas déjà fait, ajoutez Firebase à votre projet Android.
Pour une expérience optimale avec FCM, nous vous recommandons vivement d'activer Google Analytics dans votre projet. Google Analytics est obligatoire pour les rapports de diffusion des messages pour FCM.
Modifier le fichier manifeste de votre application
Ajoutez les éléments suivants au fichier manifeste de votre application :
- Un service qui étend
FirebaseMessagingService. Cette option est obligatoire si vous souhaitez gérer les messages au-delà de la réception de notifications sur les applications en arrière-plan. Pour recevoir des notifications dans les applications de premier plan, recevoir une charge utile de données, etc., vous devez étendre ce service. - (Facultatif) Dans le composant d'application, des éléments de métadonnées pour définir une icône et une couleur de notification par défaut. Android utilise ces valeurs lorsque les messages entrants ne définissent pas explicitement d'icône ni de couleur.
- (Facultatif) À partir d'Android 8.0 (niveau d'API 26) et versions ultérieures,
les canaux de notification sont compatibles et recommandés. FCM fournit un canal de notification par défaut
avec des paramètres de base. Si vous préférez
créer et utiliser votre propre canal par défaut,
définissez
default_notification_channel_idsur l'ID de votre objet de canal de notification comme indiqué ; FCM utilisera cette valeur lorsque les messages entrants ne définiront pas explicitement de canal de notification. Pour en savoir plus, consultez Gérer les canaux de notification.
<service android:name=".java.MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
<!-- Set custom default icon. This is used when no icon is set for incoming notification messages. See README(https://goo.gl/l4GJaQ) for more. --> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_stat_ic_notification" /> <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming notification message. See README(https://goo.gl/6BKBk7) for more. --> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorAccent" />
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id" />
Demander l'autorisation d'exécution des notifications sur Android 13 et versions ultérieures
Android 13 introduit une nouvelle autorisation d'exécution pour afficher les notifications. Cela affecte toutes les applications exécutées sur Android 13 ou version ultérieure qui utilisent les FCM notifications.
Par défaut, le FCM SDK (version 23.0.6 ou ultérieure) inclut l'
POST_NOTIFICATIONS
autorisation définie dans le fichier manifeste.
Toutefois, votre application devra également demander la version d'exécution de cette autorisation à l'aide de la constante android.permission.POST_NOTIFICATIONS.
Votre application ne sera pas autorisée à afficher des notifications tant que l'utilisateur n'aura pas accordé cette autorisation.
Pour demander la nouvelle autorisation d'exécution :
Kotlin
// Declare the launcher at the top of your Activity/Fragment: private val requestPermissionLauncher = registerForActivityResult( ActivityResultContracts.RequestPermission(), ) { isGranted: Boolean -> if (isGranted) { // FCM SDK (and your app) can post notifications. } else { // TODO: Inform user that that your app will not show notifications. } } private fun askNotificationPermission() { // This is only necessary for API level >= 33 (TIRAMISU) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED ) { // FCM SDK (and your app) can post notifications. } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) { // TODO: display an educational UI explaining to the user the features that will be enabled // by them granting the POST_NOTIFICATION permission. This UI should provide the user // "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission. // If the user selects "No thanks," allow the user to continue without notifications. } else { // Directly ask for the permission requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) } } }
Java
// Declare the launcher at the top of your Activity/Fragment: private final ActivityResultLauncher<String> requestPermissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> { if (isGranted) { // FCM SDK (and your app) can post notifications. } else { // TODO: Inform user that that your app will not show notifications. } }); private void askNotificationPermission() { // This is only necessary for API level >= 33 (TIRAMISU) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) { // FCM SDK (and your app) can post notifications. } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) { // TODO: display an educational UI explaining to the user the features that will be enabled // by them granting the POST_NOTIFICATION permission. This UI should provide the user // "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission. // If the user selects "No thanks," allow the user to continue without notifications. } else { // Directly ask for the permission requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS); } } }
En règle générale, vous devez afficher une interface utilisateur expliquant à l'utilisateur les fonctionnalités qui seront activées s'il autorise l'application à publier des notifications. Cette interface utilisateur doit fournir à l'utilisateur des options pour accepter ou refuser, telles que les boutons OK et Non, merci. Si l'utilisateur sélectionne OK, demandez directement l'autorisation. Si l'utilisateur sélectionne Non, merci, autorisez l'utilisateur à continuer sans notifications.
Pour en savoir plus sur les bonnes pratiques concernant le moment où votre application doit demander l'autorisation Autorisation d'exécution des notifications
à l'utilisateur, consultez
POST_NOTIFICATIONS.
Autorisations de notification pour les applications ciblant Android 12L (niveau d'API 32) ou version antérieure
Android demande automatiquement l'autorisation à l'utilisateur la première fois que votre application crée un canal de notification, à condition qu'elle soit au premier plan. Toutefois, il existe des mises en garde importantes concernant le moment de la création du canal et des demandes d'autorisation :
- Si votre application crée son premier canal de notification lorsqu'elle s'exécute en arrière-plan, ce que fait le FCM SDK lors de la réception d'une FCM notification, Android n'autorisera pas l'affichage de la notification et n'invitera pas l'utilisateur à accorder l'autorisation de notification avant la prochaine ouverture de votre application. Cela signifie que toutes les notifications reçues avant l'ouverture de votre application et l'acceptation de l'autorisation par l'utilisateur seront perdues.
- Nous vous recommandons vivement de mettre à jour votre application pour cibler Android 13 ou version ultérieure afin de profiter des API de la plate-forme pour demander l'autorisation. Si cela n'est pas possible, votre application doit créer des canaux de notification avant d'envoyer des notifications à l'application afin de déclencher la boîte de dialogue d'autorisation de notification et de s'assurer qu'aucune notification n'est perdue. Pour en savoir plus, consultez Bonnes pratiques concernant les autorisations de notification.
Facultatif : supprimer l'autorisation POST_NOTIFICATIONS
Par défaut, le FCM SDK inclut l'autorisation POST_NOTIFICATIONS.
Si votre application n'utilise pas de messages de notification (que ce soit via des FCM
notifications, via un autre SDK ou directement publiés par votre application) et que vous
ne souhaitez pas que votre application inclue l'autorisation, vous pouvez la supprimer à l'aide du
fusionneur de fichiers manifeste
remove marqueur. N'oubliez pas que la suppression de cette autorisation empêche l'affichage
de toutes les notifications, et pas seulement les notifications FCM. Ajoutez les éléments suivants au fichier manifeste de votre application :
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" tools:node="remove"/>
Accéder au jeton d'enregistrement FCM
Au démarrage initial de votre application, le FCM SDK génère un jeton d'enregistrement
pour l'instance de l'application cliente. Si vous souhaitez cibler des instances d'application uniques ou
créer des groupes d'appareils, vous devrez accéder à ce jeton en étendant
FirebaseMessagingService et en remplaçant onNewToken. Étant donné que le
jeton peut être renouvelé après le démarrage initial, nous vous recommandons vivement de récupérer le dernier jeton d'enregistrement mis à jour.
Le jeton d'enregistrement peut changer dans les cas suivants :
- L'application est restaurée sur un nouvel appareil.
- L'utilisateur désinstalle/réinstalle l'application.
- L'utilisateur efface les données de l'application.
Récupérer le jeton d'enregistrement actuel
Lorsque vous devez récupérer le jeton actuel, appelez
FirebaseMessaging.getInstance().getToken() :
Kotlin
FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task -> if (!task.isSuccessful) { Log.w(TAG, "Fetching FCM registration token failed", task.exception) return@OnCompleteListener } // Get new FCM registration token val token = task.result // Log and toast val msg = getString(R.string.msg_token_fmt, token) Log.d(TAG, msg) Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show() })
Java
FirebaseMessaging.getInstance().getToken() .addOnCompleteListener(new OnCompleteListener<String>() { @Override public void onComplete(@NonNull Task<String> task) { if (!task.isSuccessful()) { Log.w(TAG, "Fetching FCM registration token failed", task.getException()); return; } // Get new FCM registration token String token = task.getResult(); // Log and toast String msg = getString(R.string.msg_token_fmt, token); Log.d(TAG, msg); Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } });
Surveiller la génération de jetons
Le rappel onNewToken se déclenche chaque fois qu'un nouveau jeton est généré.
Kotlin
/** * Called if the FCM registration token is updated. This may occur if the security of * the previous token had been compromised. Note that this is called when the * FCM registration token is initially generated so this is where you would retrieve the token. */ override fun onNewToken(token: String) { Log.d(TAG, "Refreshed token: $token") // If you want to send messages to this application instance or // manage this apps subscriptions on the server side, send the // FCM registration token to your app server. sendRegistrationToServer(token) }
Java
/** * There are two scenarios when onNewToken is called: * 1) When a new token is generated on initial app startup * 2) Whenever an existing token is changed * Under #2, there are three scenarios when the existing token is changed: * A) App is restored to a new device * B) User uninstalls/reinstalls the app * C) User clears app data */ @Override public void onNewToken(@NonNull String token) { Log.d(TAG, "Refreshed token: " + token); // If you want to send messages to this application instance or // manage this apps subscriptions on the server side, send the // FCM registration token to your app server. sendRegistrationToServer(token); }
Une fois le jeton obtenu, vous pouvez l'envoyer au serveur de votre application et le stocker à l'aide de la méthode de votre choix.
Vérifier les services Google Play
Les applications qui s'appuient sur le SDK Play Services doivent toujours vérifier si l'appareil dispose d'un APK des services Google Play compatible avant d'accéder aux fonctionnalités des services Google Play. Pour en savoir plus, consultezConfigurer les services Google Play. Il est recommandé de le faire à deux endroits : dans la méthode onCreate() de l'activité principale et dans sa méthode onResume(). La vérification dans onCreate() garantit que l'application ne peut pas être utilisée sans une vérification réussie. La vérification dans onResume() garantit que si l'utilisateur revient à l'application en cours d'exécution par un autre moyen, par exemple via le bouton "Retour", la vérification est toujours effectuée.
Si l'appareil ne dispose pas d'une version compatible des services Google Play, votre
application peut appeler
GoogleApiAvailability.makeGooglePlayServicesAvailable()
pour permettre aux utilisateurs de télécharger les services Google Play depuis le Play Store.
Empêcher l'initialisation automatique
Lorsqu'un jeton d'enregistrement FCM est généré, la bibliothèque importe l'identifiant et les données de configuration
dans Firebase. Si vous préférez empêcher la génération automatique de jetons, désactivez la collecte Analytics et l'initialisation automatique de FCM (vous
devez désactiver les deux) en ajoutant ces valeurs de métadonnées à votre
AndroidManifest.xml :
<meta-data android:name="firebase_messaging_auto_init_enabled" android:value="false" /> <meta-data android:name="firebase_analytics_collection_enabled" android:value="false" />
Pour réactiver l'initialisation automatique de FCM, effectuez un appel d'exécution :
Kotlin
Firebase.messaging.isAutoInitEnabled = true
Java
FirebaseMessaging.getInstance().setAutoInitEnabled(true);
Pour réactiver la collecte Analytics, appelez la
setAnalyticsCollectionEnabled()
méthode de la FirebaseAnalytics classe. Exemple :
setAnalyticsCollectionEnabled(true);
Une fois définies, ces valeurs sont conservées lors des redémarrages de l'application.
Envoyer un message de notification
Pour vous assurer que votre client Android est correctement configuré, vous pouvez envoyer un message de notification test en suivant les instructions ci-dessous :
Installez et exécutez l'application sur l'appareil cible.
Assurez-vous que l'application est en arrière-plan sur l'appareil.
Dans la console Firebase, accédez à DevOps et engagement > Messagerie.
Créez une campagne.
S'il s'agit de votre premier message :
Sélectionnez Créer votre première campagne.
Sélectionnez Messages de notification Firebase , puis Créer.
Si vous avez déjà créé des campagnes :
Sous l'onglet Campagnes, sélectionnez Nouvelle campagne.
Cliquez sur Notifications.
Saisissez le texte du message. Tous les autres sont facultatifs.
Sélectionnez Envoyer un message test dans le volet de droite.
Dans le champ Ajouter un jeton d'enregistrement FCM, saisissez le jeton d'enregistrement que vous avez obtenu dans une section précédente de ce guide.
Sélectionnez Tester.
L'appareil client ciblé, avec l'application en arrière-plan, devrait recevoir la notification.
Pour obtenir des informations sur la diffusion des messages dans votre application, accédez au DevOps et engagement > Messagerie > Rapports dashboard dans la console Firebase. Ce tableau de bord enregistre le nombre de messages envoyés et ouverts sur les appareils Apple et Android, ainsi que les données relatives aux "impressions" (notifications vues par les utilisateurs) pour les applications Android.
Étapes suivantes
Une fois les étapes de configuration terminées, voici quelques options pour continuer à utiliser avec FCM pour Android :
- Envoyer des messages aux appareils
- Recevoir des messages dans une application Android
- Envoyer des messages à des sujets