Pour écrire votre application cliente Firebase Cloud Messaging multiplate-forme avec C++, utilisez l'API Firebase Cloud Messaging. Le SDK C++ fonctionne pour les plates-formes Android et Apple, mais une configuration supplémentaire est requise pour chacune d'elles.
Configurer Firebase et le SDK FCM
Android
Si ce n'est pas encore fait, ajoutez Firebase à votre projet C++.
Dans les instructions de configuration associées, consultez les exigences concernant l'appareil et l'application pour utiliser le SDK Firebase C++, y compris la recommandation d'utiliser CMake pour compiler votre application.
Dans le fichier
build.gradle
au niveau du projet, veillez à inclure le dépôt Maven de Google à la fois dans les sectionsbuildscript
etallprojects
.
Créez un objet Firebase App en transmettant l'environnement JNI et l'activité :
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
Définissez une classe qui implémente l'interface
firebase::messaging::Listener
.Initialisez FCM en transmettant l'application et un écouteur construit :
::firebase::messaging::Initialize(app, listener);
Les applications qui s'appuient sur le SDK des services Google Play doivent vérifier si l'appareil dispose d'un APK des services Google Play compatible avant d'accéder aux fonctionnalités. Pour en savoir plus, consultez Vérifier l'APK des services Google Play.
iOS+
- Si ce n'est pas encore fait, ajoutez Firebase à votre projet C++. Ensuite, pour configurer votre projet pour FCM :
- Dans le fichier Podfile de votre projet, ajoutez la dépendance FCM :
pod 'FirebaseMessaging'
- Faites glisser les frameworks
firebase.framework
etfirebase_messaging.framework
dans votre projet Xcode à partir du SDK Firebase C++.
- Dans le fichier Podfile de votre projet, ajoutez la dépendance FCM :
Importez votre clé d'authentification APNs dans Firebase. Si vous ne possédez pas encore de clé d'authentification APNs, veillez à en créer une dans le Centre des membres Apple Developer.
-
Dans votre projet de la console Firebase, sélectionnez l'icône en forme de roue dentée, puis Paramètres du projet et enfin l'onglet Cloud Messaging.
-
Dans Clé d'authentification APNs sous Configuration de l'application iOS, cliquez sur le bouton Importer.
-
Accédez à l'emplacement où vous avez enregistré votre clé, sélectionnez-la, puis cliquez sur Ouvrir. Ajoutez l'ID de la clé (disponible dans l' Apple Developer Member Center), puis cliquez sur Importer.
-
Configurez votre projet Xcode pour activer les notifications push :
- Sélectionnez le projet dans la zone Navigator.
- Sélectionnez la cible du projet dans la zone de l'éditeur.
Sélectionnez l'onglet Général dans la zone de l'éditeur.
- Faites défiler la page jusqu'à Linked Frameworks and Libraries (Bibliothèques et frameworks associés), puis cliquez sur le bouton + pour ajouter des frameworks.
Dans la fenêtre qui s'affiche, faites défiler la page jusqu'à UserNotifications.framework, cliquez sur cette entrée, puis sur Ajouter.
Ce framework n'apparaît que dans Xcode v8 et versions ultérieures, et est requis par cette bibliothèque.
Sélectionnez l'onglet Fonctionnalités dans la zone de l'éditeur.
- Activez l'option Notifications push.
- Faites défiler l'écran vers le bas jusqu'à Modes d'arrière-plan, puis activez l'option en sélectionnant Activé.
- Sélectionnez Notifications à distance sous Modes d'arrière-plan.
Créez un objet Firebase App :
app = ::firebase::App::Create(::firebase::AppOptions());
Définissez une classe qui implémente l'interface
firebase::messaging::Listener
.Initialisez Firebase Cloud Messaging en transmettant l'application et un écouteur construit :
::firebase::messaging::Initialize(app, listener);
Accéder au jeton d'enregistrement de l'appareil
Lors de l'initialisation de la bibliothèque Firebase Cloud Messaging, un jeton d'enregistrement est demandé pour l'instance de l'application cliente. L'application recevra le jeton avec le rappel OnTokenReceived
, qui doit être défini dans la classe qui implémente firebase::messaging::Listener
.
Si vous souhaitez cibler cet appareil spécifique, vous aurez besoin d'accéder à ce jeton.
Remarque concernant la distribution des messages sur Android
Lorsque l'application n'est pas du tout en cours d'exécution et qu'un utilisateur appuie sur une notification, le message n'est pas, par défaut, routé via les rappels intégrés de FCM. Dans ce cas, les charges utiles des messages sont reçues via un Intent
utilisé pour démarrer l'application. Pour que FCM transmette ces messages entrants au rappel de la bibliothèque C++, vous devez remplacer la méthode onNewIntent
dans votre activité et transmettre Intent
à MessageForwardingService
.
import com.google.firebase.messaging.MessageForwardingService; class MyActivity extends Activity { private static final String TAG = "MyActvity"; @Override protected void onNewIntent(Intent intent) { Log.d(TAG, "A message was sent to this app while it was in the background."); Intent message = new Intent(this, MessageForwardingService.class); message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT); message.putExtras(intent); message.setData(intent.getData()); // For older versions of Firebase C++ SDK (< 7.1.0), use `startService`. // startService(message); MessageForwardingService.enqueueWork(this, message); } }
Le contenu du champ de notification des messages reçus lorsque l'application est en arrière-plan est utilisé pour remplir la notification de la barre d'état système, mais ce contenu de notification ne sera pas communiqué à FCM. Autrement dit, Message::notification
sera nul.
En résumé :
État de l'application | Notification | Données | Les deux |
---|---|---|---|
Premier plan | OnMessageReceived |
OnMessageReceived |
OnMessageReceived |
Arrière-plan | Barre d'état système | OnMessageReceived |
Notification : barre d'état système Données : dans les extras de l'intent. |
Gestion des messages personnalisés sur Android
Par défaut, les notifications envoyées à l'application sont transmises à ::firebase::messaging::Listener::OnMessageReceived
, mais dans certains cas, vous pouvez remplacer le comportement par défaut. Pour ce faire sur Android, vous devrez écrire des classes personnalisées qui étendent com.google.firebase.messaging.cpp.ListenerService
et mettre à jour le AndroidManifest.xml
de votre projet.
Remplacez les méthodes ListenerService
.
ListenerService
est la classe Java qui intercepte les messages entrants envoyés à l'application et les achemine vers la bibliothèque C++. Lorsque l'application est au premier plan (ou en arrière-plan et qu'elle reçoit une charge utile de données uniquement), les messages passent par l'un des rappels fournis sur cette classe. Pour ajouter un comportement personnalisé à la gestion des messages, vous devez étendre le ListenerService
par défaut de FCM :
import com.google.firebase.messaging.cpp.ListenerService; class MyListenerService extends ListenerService {
En remplaçant la méthode ListenerService.onMessageReceived
, vous pouvez effectuer des actions en fonction de l'objet RemoteMessage reçu et obtenir les données du message :
@Override public void onMessageReceived(RemoteMessage message) { Log.d(TAG, "A message has been received."); // Do additional logic... super.onMessageReceived(message); }
ListenerService
comporte également d'autres méthodes moins fréquemment utilisées.
Ces valeurs peuvent également être remplacées. Pour en savoir plus, consultez la référence FirebaseMessagingService.
@Override public void onDeletedMessages() { Log.d(TAG, "Messages have been deleted on the server."); // Do additional logic... super.onDeletedMessages(); } @Override public void onMessageSent(String messageId) { Log.d(TAG, "An outgoing message has been sent."); // Do additional logic... super.onMessageSent(messageId); } @Override public void onSendError(String messageId, Exception exception) { Log.d(TAG, "An outgoing message encountered an error."); // Do additional logic... super.onSendError(messageId, exception); }
Mettre à jour AndroidManifest.xml
Une fois vos classes personnalisées écrites, elles doivent être incluses dans le fichier AndroidManifest.xml
pour prendre effet. Assurez-vous que le fichier manifeste inclut les outils de fusion en déclarant l'attribut approprié dans la balise <manifest>
, comme suit :
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.firebase.messaging.cpp.samples" xmlns:tools="http://schemas.android.com/tools">
Dans l'archive firebase_messaging_cpp.aar
se trouve un fichier AndroidManifest.xml
qui déclare le ListenerService
par défaut de FCM. Ce fichier manifeste est normalement fusionné avec le fichier manifeste spécifique au projet, ce qui permet à ListenerService
de s'exécuter. ListenerService
doit être remplacé par le service d'écouteur personnalisé. Pour ce faire, supprimez le ListenerService
par défaut et ajoutez le service personnalisé à l'aide des lignes suivantes dans le fichier AndroidManifest.xml
de votre projet :
<service android:name="com.google.firebase.messaging.cpp.ListenerService" tools:node="remove" />
<service android:name="com.google.firebase.messaging.cpp.samples.MyListenerService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service>
Les nouvelles versions du SDK C++ Firebase (7.1.0 et versions ultérieures) utilisent JobIntentService
, ce qui nécessite des modifications supplémentaires dans le fichier AndroidManifest.xml
.
<service android:name="com.google.firebase.messaging.MessageForwardingService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="false" > </service>
Empêcher l'initialisation automatique
FCM génère un jeton d'enregistrement pour le ciblage des appareils.
Lorsqu'un jeton est généré, la bibliothèque importe l'identifiant et les données de configuration dans Firebase. Si vous souhaitez obtenir un consentement explicite avant d'utiliser le jeton, vous pouvez empêcher sa génération lors de la configuration en désactivant FCM (et Analytics sur Android). Pour ce faire, ajoutez une valeur de métadonnées à votre Info.plist
(et non à votre GoogleService-Info.plist
) sur les plates-formes Apple, ou à votre AndroidManifest.xml
sur Android :
Android
<?xml version="1.0" encoding="utf-8"?> <application> <meta-data android:name="firebase_messaging_auto_init_enabled" android:value="false" /> <meta-data android:name="firebase_analytics_collection_enabled" android:value="false" /> </application>
Swift
FirebaseMessagingAutoInitEnabled = NO
Pour réactiver FCM, vous pouvez effectuer un appel d'exécution :
::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);
Une fois définie, cette valeur persiste lors des redémarrages de l'application.
Gérer les messages avec des liens profonds sur Android
FCM permet d'envoyer des messages contenant un lien profond vers votre application. Pour recevoir des messages contenant un lien profond, vous devez ajouter un filtre d'intent à l'activité qui gère les liens profonds pour votre application. Le filtre d'intent doit capter les liens profonds de votre domaine. Si vos messages ne contiennent pas de lien profond, cette configuration n'est pas nécessaire. Dans AndroidManifest.xml :
<intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="http"/> <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="https"/> </intent-filter>
Il est également possible de spécifier un caractère générique pour rendre le filtre d'intent plus flexible. Exemple :
<intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:host="*.example.com" android:scheme="http"/> <data android:host="*.example.com" android:scheme="https"/> </intent-filter>
Lorsque les utilisateurs appuient sur une notification contenant un lien vers le schéma et l'hôte que vous spécifiez, votre application démarre l'activité avec ce filtre d'intent pour gérer le lien.
Étapes suivantes
Une fois l'application cliente configurée, vous pouvez envoyer des messages en aval et thématiques avec Firebase. Pour en savoir plus, consultez la démonstration de cette fonctionnalité dans l'exemple de démarrage rapide que vous pouvez télécharger, exécuter et examiner.
Pour ajouter d'autres comportements plus avancés à votre application, consultez les guides pour envoyer des messages depuis un serveur d'application :
N'oubliez pas que vous aurez besoin d'une implémentation de serveur pour utiliser ces fonctionnalités.