Erste Schritte mit Firebase Cloud Messaging in C++-Apps

Plattform auswählen : iOS+ Android Web Flutter Unity C++


In diesem Leitfaden wird beschrieben, wie Sie Firebase Cloud Messaging in Ihren C++-Client-Apps einrichten, damit Sie zuverlässig Nachrichten senden können.

Wenn Sie Ihre plattformübergreifende Firebase Cloud Messaging Client-App mit C++ schreiben möchten, verwenden Sie die Firebase Cloud Messaging API. Das C++ SDK funktioniert sowohl für Android- als auch für Apple-Plattformen. Für jede Plattform ist jedoch eine zusätzliche Einrichtung erforderlich. Weitere Informationen zur Funktionsweise des C++ SDK für iOS und Android mit FCM, finden Sie unter Firebase für C++.

Firebase und das FCM SDK einrichten

Android

  1. Fügen Sie Ihrem C++-Projekt Firebase hinzu, falls noch nicht geschehen.

    • Lesen Sie in der verlinkten Einrichtungsanleitung die Geräte- und App Anforderungen für die Verwendung des Firebase C++ SDK, einschließlich der Empfehlung, CMake zum Erstellen Ihrer App zu verwenden.

    • In die Datei build.gradle auf Projektebene muss das Maven-Repository von Google in die Abschnitte buildscript und allprojects aufgenommen werden.

  2. Erstellen Sie ein Firebase App-Objekt und übergeben Sie die JNI-Umgebung und die Aktivität:

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

  3. Definieren Sie eine Klasse, die die Schnittstelle firebase::messaging::Listener implementiert.

  4. Initialisieren Sie FCM und übergeben Sie die App und einen erstellten Listener:

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

  5. Apps, die auf dem Google Play-Dienste SDK basieren, sollten auf dem Gerät nach einem kompatiblen Google Play-Dienste APK suchen, bevor sie auf die Funktionen zugreifen. Weitere Informationen finden Sie unter Nach Google Play-Dienste APK suchen.

iOS+

  1. Fügen Sie Ihrem C++-Projekt Firebase hinzu, falls noch nicht geschehen. So richten Sie Ihr Projekt für FCM ein:
    1. Fügen Sie in der Podfile-Datei Ihres Projekts die FCM-Abhängigkeit hinzu:
      pod 'FirebaseMessaging'
    2. Ziehen Sie die firebase.framework und firebase_messaging.framework Frameworks aus dem Firebase C++ SDK in Ihr Xcode-Projekt.
  2. Laden Sie Ihren APNs-Authentifizierungsschlüssel in Firebase hoch. Wenn Sie noch keinen APNs-Authentifizierungsschlüssel haben, erstellen Sie einen im Apple Developer Member Center.

    1. Wählen Sie in Ihrem Projekt in der Firebase Konsole das Zahnradsymbol und dann Projekteinstellungen und den Cloud Messaging Tab aus.

    2. Klicken Sie unter APNs-Authentifizierungsschlüssel im Abschnitt Konfiguration der iOS-App auf die Schaltfläche Hochladen , um Ihren Authentifizierungsschlüssel für die Entwicklung oder den Authentifizierungsschlüssel für die Produktion oder beide hochzuladen. Mindestens einer ist erforderlich.

    3. Suchen Sie den Speicherort, an dem Sie den Schlüssel gespeichert haben, wählen Sie ihn aus und klicken Sie auf Öffnen. Fügen Sie die Schlüssel-ID für den Schlüssel hinzu (verfügbar im Apple Developer Member Center) und klicken Sie auf Hochladen.

  3. Konfigurieren Sie Ihr Xcode-Projekt, um Push-Benachrichtigungen zu aktivieren:

    1. Wählen Sie das Projekt im Navigationsbereich aus.
    2. Wählen Sie das Projektziel im Editorbereich aus.
    3. Wählen Sie im Editorbereich den Tab Allgemein aus.

      1. Scrollen Sie zu Verknüpfte Frameworks und Bibliotheken und klicken Sie auf die Schaltfläche +, um Frameworks hinzuzufügen.
      2. Scrollen Sie im angezeigten Fenster zu UserNotifications.framework, klicken Sie auf den Eintrag und dann auf Hinzufügen.

        Dieses Framework ist nur in Xcode Version 8 und höher verfügbar und wird von dieser Bibliothek benötigt.

    4. Wählen Sie im Editorbereich den Tab Funktionen aus.

      1. Stellen Sie Push-Benachrichtigungen auf Ein.
      2. Scrollen Sie zu Hintergrundmodi und stellen Sie die Option auf Ein.
      3. Wählen Sie unter Hintergrundmodi die Option Remote-Benachrichtigungen aus.
  4. Erstellen Sie ein Firebase App-Objekt:

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

  5. Definieren Sie eine Klasse, die die Schnittstelle firebase::messaging::Listener implementiert.

  6. Initialisieren Sie Firebase Cloud Messaging und übergeben Sie die App und einen erstellten Listener:

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

Auf das FCM Registrierungstoken zugreifen

Beim Initialisieren der Firebase Cloud Messaging-Bibliothek wird ein Registrierungstoken für die Client-App-Instanz angefordert. Die App erhält das Token mit dem OnTokenReceived-Callback, das in der Klasse definiert werden muss, die firebase::messaging::Listener implementiert.

Wenn Sie diese bestimmte App-Instanz verwenden möchten, benötigen Sie Zugriff auf dieses Token.

Hinweis zur Nachrichtenzustellung unter Android

Wenn die App nicht ausgeführt wird und ein Nutzer auf eine Benachrichtigung tippt, wird die Nachricht standardmäßig nicht über die integrierten FCM's Callbacks weitergeleitet. In diesem Fall werden Nachrichten-Nutzlasten über eine Intent-Nachricht empfangen, mit der die Anwendung gestartet wird. Damit FCM diese eingehenden Nachrichten an den C++-Bibliotheks-Callback weiterleitet, müssen Sie die Methode onNewIntent in Ihrer Aktivität überschreiben und die Intent an den MessageForwardingService übergeben.

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);
  }
}

Bei Nachrichten, die empfangen werden, während sich die App im Hintergrund befindet, wird der Inhalt des Benachrichtigungsfelds verwendet, um die Benachrichtigung in der Taskleiste zu füllen. Dieser Benachrichtigungsinhalt wird jedoch nicht an FCM gesendet. Message::notification ist also ein Nullwert.

Zusammenfassung:

App-Status Benachrichtigung Daten Beides
Vordergrund OnMessageReceived OnMessageReceived OnMessageReceived
Hintergrund Taskleiste OnMessageReceived Benachrichtigung: Taskleiste
Daten: in den Extras der Intent-Nachricht

Benutzerdefinierte Nachrichtenverarbeitung unter Android

Standardmäßig werden an die App gesendete Benachrichtigungen an ::firebase::messaging::Listener::OnMessageReceived übergeben. In einigen Fällen möchten Sie jedoch möglicherweise das Standardverhalten überschreiben. Dazu müssen Sie unter Android benutzerdefinierte Klassen schreiben, die com.google.firebase.messaging.cpp.ListenerService erweitern, und die Datei AndroidManifest.xml Ihres Projekts aktualisieren.

ListenerService-Methoden überschreiben

ListenerService ist die Java-Klasse, die eingehende Nachrichten abfängt, die an die App gesendet werden, und sie an die C++-Bibliothek weiterleitet. Wenn sich die App im Vordergrund befindet (oder wenn sie sich im Hintergrund befindet und eine reine Daten-Nutzlast empfängt), werden Nachrichten über einen der in dieser Klasse bereitgestellten Callbacks weitergeleitet. Wenn Sie der Nachrichtenverarbeitung ein benutzerdefiniertes Verhalten hinzufügen möchten, müssen Sie den Standard-FCM's ListenerService erweitern:

import com.google.firebase.messaging.cpp.ListenerService;

class MyListenerService extends ListenerService {

Durch Überschreiben der Methode ListenerService.onMessageReceived können Sie Aktionen basierend auf dem empfangenen RemoteMessage -Objekt ausführen und die Nachrichtendaten abrufen:

@Override
public void onMessageReceived(RemoteMessage message) {
  Log.d(TAG, "A message has been received.");
  // Do additional logic...
  super.onMessageReceived(message);
}

ListenerService hat auch einige andere Methoden, die seltener verwendet werden. Diese können ebenfalls überschrieben werden. Weitere Informationen finden Sie in der Referenz zu 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);
}

AndroidManifest.xml aktualisieren

Nachdem Sie Ihre benutzerdefinierten Klassen geschrieben haben, müssen sie in die Datei AndroidManifest.xml aufgenommen werden, damit sie wirksam werden. Das Manifest muss die Zusammenführungstools enthalten. Deklarieren Sie dazu das entsprechende Attribut im Tag <manifest>, wie folgt:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.google.firebase.messaging.cpp.samples"
    xmlns:tools="http://schemas.android.com/tools">

Im Archiv firebase_messaging_cpp.aar befindet sich eine Datei AndroidManifest.xml , in der der Standard-ListenerService von FCM deklariert ist. Dieses Manifest wird normalerweise mit dem projektspezifischen Manifest zusammengeführt, wodurch der ListenerService ausgeführt werden kann. Dieser ListenerService muss durch den benutzerdefinierten Listener-Dienst ersetzt werden. Dazu entfernen Sie den Standard-ListenerService und fügen den benutzerdefinierten Dienst hinzu. Das können Sie mit den folgenden Zeilen in der Datei AndroidManifest.xml Ihres Projekts tun:

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

In neuen Versionen des Firebase C++ SDK (ab Version 7.1.0) wird JobIntentService verwendet, was zusätzliche Änderungen in der Datei AndroidManifest.xml erfordert.

<service android:name="com.google.firebase.messaging.MessageForwardingService"
     android:permission="android.permission.BIND_JOB_SERVICE"
     android:exported="false" >
</service>

Automatische Initialisierung verhindern

FCM generiert ein Registrierungstoken für die Ausrichtung auf App-Instanzen. Wenn ein Token generiert wird, lädt die Bibliothek die Kennung und die Konfigurationsdaten in Firebase hoch. Wenn Sie vor der Verwendung des Tokens eine ausdrückliche Einwilligung einholen möchten, können Sie die Generierung bei der Konfiguration verhindern, indem Sie FCM (und unter Android Analytics) deaktivieren. Fügen Sie dazu einen Metadatenwert in Info.plist (nicht GoogleService-Info.plist) auf Apple-Plattformen oder in AndroidManifest.xml unter Android ein:

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

Wenn Sie FCM wieder aktivieren möchten, können Sie einen Laufzeitaufruf ausführen:

::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);

Dieser Wert bleibt nach dem Festlegen bei App-Neustarts erhalten.

FCM ermöglicht das Senden von Nachrichten, die einen Deeplink zu Ihrer App enthalten. Wenn Sie Nachrichten mit einem Deeplink empfangen möchten, müssen Sie der Aktivität, die Deeplinks für Ihre App verarbeitet, einen neuen Intent-Filter hinzufügen. Der Intent-Filter sollte Deeplinks Ihrer Domain abfangen. Wenn Ihre Nachrichten keinen Deeplink enthalten, ist diese Konfiguration nicht erforderlich. In 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>

Sie können auch einen Platzhalter angeben, um den Intent-Filter flexibler zu gestalten. Beispiel:

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

Wenn Nutzer auf eine Benachrichtigung tippen, die einen Link zum von Ihnen angegebenen Schema und Host enthält, startet Ihre App die Aktivität mit diesem Intent-Filter, um den Link zu verarbeiten.

Nächste Schritte

Nachdem Sie die Einrichtungsschritte abgeschlossen haben, haben Sie folgende Möglichkeiten, mit FCM für C++ fortzufahren: