Premiers pas avec Firebase Cloud Messaging dans les applications C++

Sélectionnez la plate-forme : iOS+ Android Web Flutter Unity C++


Ce guide explique comment commencer à utiliser Firebase Cloud Messaging dans vos applications clientes C++ afin de pouvoir envoyer des messages de manière fiable.

Pour écrire votre application cliente multiplate-forme Firebase Cloud Messaging avec C++, utilisez l' Firebase Cloud Messaging API. Le SDK C++ fonctionne sur les plates-formes Android et Apple, mais une configuration supplémentaire est requise pour chaque plate-forme. Pour en savoir plus sur le fonctionnement du SDK C++ pour iOS et Android avec FCM, consultez Comprendre Firebase pour C++.

Configurer Firebase et le FCM SDK

Android

  1. Si ce n'est pas déjà fait, ajoutez Firebase à votre projet C++.

    • Dans les instructions de configuration associées, consultez les exigences concernant les appareils et les applications pour utiliser le Firebase C++ SDK, y compris la recommandation d'utiliser CMake pour créer votre application.

    • Dans le fichier build.gradle au niveau du projet, veillez à inclure le dépôt Maven de Google à la fois dans les sections buildscript et allprojects.

    .
  2. Créez un objet Firebase App en transmettant l'environnement JNI et l'activité :

    app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);

  3. Définissez une classe qui implémente l'interface firebase::messaging::Listener.

  4. Initialisez FCM en transmettant l'application et un écouteur construit :

    ::firebase::messaging::Initialize(app, listener);

  5. 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 si l'APK des services Google Play est disponible.

iOS+

  1. Si ce n'est pas déjà fait, ajoutez Firebase à votre projet C++. Ensuite, pour configurer votre projet pour FCM:
    1. Dans le Podfile de votre projet, ajoutez la dépendance FCM :
      pod 'FirebaseMessaging'
    2. Faites glisser les firebase.framework et firebase_messaging.framework frameworks dans votre projet Xcode à partir du Firebase C++ SDK.
  2. Importez votre clé d'authentification APNs dans Firebase. Si vous n'avez pas encore de clé d'authentification APNs, veillez à en créer une dans l' Apple Developer Member Center.

    1. 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.

    2. Sous Clé d'authentification APNs dans Configuration de l'application iOS, cliquez sur le bouton Importer pour importer votre clé d'authentification de développement, votre clé d'authentification de production ou les deux. bien qu'une seule méthode de contact soit obligatoire.

    3. 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.

  3. Configurez votre projet Xcode pour activer les notifications push :

    1. Sélectionnez le projet dans la zone Navigator.
    2. Sélectionnez la cible du projet dans la zone Editor.
    3. Sélectionnez l'onglet Général dans la zone Editor.

      1. Faites défiler la page jusqu'à Linked Frameworks and Libraries (Frameworks et bibliothèques associés), puis cliquez sur le bouton + pour ajouter des frameworks.
      2. Dans la fenêtre qui s'affiche, faites défiler la page jusqu'à UserNotifications.framework, cliquez sur l'entrée, puis sur Ajouter.

        Ce framework n'apparaît que dans Xcode v8 et versions ultérieures, et il est requis par cette bibliothèque.

    4. Sélectionnez l'onglet Capabilities (Fonctionnalités) dans la zone Editor.

      1. Activez Notifications push.
      2. Faites défiler la page jusqu'à Background Modes (Modes d'arrière-plan), puis activez-le.
      3. Sélectionnez Notifications à distance sous Background Modes (Modes d'arrière-plan).
  4. Créez un objet Firebase App :

    app = ::firebase::App::Create(::firebase::AppOptions());

  5. Définissez une classe qui implémente l'interface firebase::messaging::Listener.

  6. Initialisez Firebase Cloud Messaging en transmettant l'application et un écouteur construit :

    ::firebase::messaging::Initialize(app, listener);

Accéder au jeton d'enregistrement FCM

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 reçoit le jeton avec le rappel OnTokenReceived, qui doit être défini dans la classe qui implémente firebase::messaging::Listener.

Si vous souhaitez cibler cette instance d'application spécifique, vous devez avoir accès à 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, acheminé via les rappels intégrés de FCM's. Dans ce cas, les charges utiles des messages sont reçues via un Intent utilisé pour démarrer l'application. Pour que FCM transfère ces messages entrants au rappel de la bibliothèque C++, vous devez remplacer la méthode onNewIntent dans votre activité et transmettre l'Intent au 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);
  }
}

Les messages reçus lorsque l'application est en arrière-plan utilisent le contenu de leur champ de notification pour remplir la notification de la barre d'état système, mais ce contenu de notification n'est pas communiqué à FCM. Autrement dit, Message::notification sera nul.

En résumé :

État app 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 personnalisée des messages 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 devez écrire des classes personnalisées qui étendent com.google.firebase.messaging.cpp.ListenerService, et mettre à jour le fichier AndroidManifest.xml de votre projet.

Remplacer 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 lorsqu'elle est en arrière-plan et qu'elle reçoit une charge utile contenant uniquement des données), les messages passent par l'un des rappels fournis dans cette classe. Pour ajouter un comportement personnalisé à la gestion des messages, vous devez étendre le FCM's par défaut ListenerService :

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 quelques autres méthodes moins fréquemment utilisées. Elles 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, il existe 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 au ListenerService de s'exécuter. Ce ListenerService doit être remplacé par le service d'écoute personnalisé. Pour ce faire, supprimez le ListenerService par défaut et ajoutez le service personnalisé, ce qui peut être effectué avec les lignes suivantes dans le fichier AndroidManifest.xml de vos projets :

<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 Firebase C++ (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 instances d'application. 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 au moment 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 est conservée lors des redémarrages de l'application.

FCM permet d'envoyer des messages contenant un lien profond dans 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 intercepter 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 les étapes de configuration terminées, voici quelques options pour continuer à utiliser FCM pour C++ :