Firebase Cloud Messaging-Client-App mit C++ einrichten

Wenn du eine plattformübergreifende Firebase Cloud Messaging-Clientanwendung mit C++ schreiben möchtest, verwende 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.

Firebase und das FCM SDK einrichten

Android

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

    • In der verlinkten Einrichtungsanleitung findest du die Geräte- und App-Anforderungen für die Verwendung des Firebase C++ SDKs, einschließlich der Empfehlung, CMake zum Erstellen deiner 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 firebase::messaging::Listener-Schnittstelle implementiert.

  4. Initialisiere FCM und übergebe die App und einen erstellten Listener:

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

  5. Apps, die das Google Play Services SDK verwenden, sollten vor dem Zugriff auf die Funktionen prüfen, ob auf dem Gerät ein kompatibles APK für die Google Play-Dienste installiert ist. Weitere Informationen finden Sie unter APK der Google Play-Dienste prüfen.

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 Ihres Projekts die FCM-Abhängigkeit hinzu:
      pod 'FirebaseMessaging'
    2. Ziehe die firebase.framework- und firebase_messaging.framework-Frameworks aus dem Firebase C++ SDK in dein Xcode-Projekt.
  2. Laden Sie Ihren APNs-Authentifizierungsschlüssel in Firebase hoch. Wenn Sie noch keinen APN-Authentifizierungsschlüssel haben, erstellen Sie einen im Apple Developer Member Center.

    1. Klicken Sie in der Firebase Console in Ihrem Projekt auf das Zahnradsymbol, dann auf Projekteinstellungen und dann auf den Tab Cloud Messaging.

    2. Klicken Sie unter APNs-Authentifizierungsschlüssel im Abschnitt Konfiguration der iOS-App auf die Schaltfläche Hochladen.

    3. Rufen Sie den Speicherort auf, 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 so, dass Push-Benachrichtigungen aktiviert werden:

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

      1. Scrollen Sie nach unten 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 diesen Eintrag und dann auf Hinzufügen.

        Dieses Framework wird nur in Xcode 8 und höher angezeigt und ist für diese Bibliothek erforderlich.

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

      1. Stellen Sie Push-Benachrichtigungen auf An.
      2. Scrollen Sie nach unten zu Hintergrundmodi und aktivieren Sie die Option.
      3. Wählen Sie unter Hintergrundmodi die Option Remote-Benachrichtigungen aus.
  4. Firebase App-Objekt erstellen:

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

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

  6. Firebase Cloud Messaging initialisieren, indem Sie die App und einen erstellten Listener übergeben:

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

Auf das Token für die Geräteregistrierung zugreifen

Bei der Initialisierung der Firebase Cloud Messaging-Bibliothek wird ein Registrierungstoken für die Client-App-Instanz angefordert. Die App erhält das Token über den OnTokenReceived-Callback, der in der Klasse definiert sein sollte, die firebase::messaging::Listener implementiert.

Wenn Sie Ihre Anzeigen auf dieses Gerät ausrichten möchten, benötigen Sie Zugriff auf dieses Token.

Hinweis zur Nachrichtenübermittlung 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 Callbacks von FCM weitergeleitet. In diesem Fall werden Nachrichtennutzlasten über einen Intent empfangen, der zum Starten der Anwendung verwendet 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 die 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);
  }
}

Nachrichten, die empfangen werden, während die App im Hintergrund ausgeführt wird, werden im Benachrichtigungsfeld angezeigt. Der Inhalt dieser Benachrichtigung wird jedoch nicht an FCM gesendet. Das heißt, Message::notification ist null.

Zusammenfassung:

App-Status Benachrichtigung Daten Beides
Vordergrund OnMessageReceived OnMessageReceived OnMessageReceived
Hintergrund Infobereich OnMessageReceived Benachrichtigung: Infobereich
Daten: in den Extras der Intent.

Benutzerdefinierte Nachrichtenverarbeitung unter Android

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

ListenerService-Methoden überschreiben.

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

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

class MyListenerService extends ListenerService {

Wenn du die Methode ListenerService.onMessageReceived überschreibst, kannst du 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 bietet auch einige andere Methoden, die seltener verwendet werden. Diese können auch überschrieben werden. Weitere Informationen finden Sie in der Referenz zum 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 der AndroidManifest.xml enthalten sein, damit sie wirksam werden. Achte darauf, dass das Manifest die Zusammenführungstools enthält. Dazu musst du das entsprechende Attribut im <manifest>-Tag deklarieren. So gehts:

<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 firebase_messaging_cpp.aar-Archiv gibt es eine AndroidManifest.xml-Datei, in der ListenerService als Standard für FCM deklariert wird. Dieses Manifest wird normalerweise mit dem projektspezifischen Manifest zusammengeführt, damit die ListenerService ausgeführt werden kann. Diese ListenerService muss durch den benutzerdefinierten Listener-Dienst ersetzt werden. Dazu entfernen Sie den Standard-ListenerService und fügen den benutzerdefinierten Dienst hinzu. Das geht mit den folgenden Zeilen in der AndroidManifest.xml-Datei Ihres Projekts:

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

Neue Versionen des Firebase C++ SDK (ab 7.1.0) verwenden JobIntentService, was zusätzliche Änderungen an 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 Geräteausrichtung. 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 explizite Einwilligung erhalten möchten, können Sie die Generierung bei der Konfiguration verhindern, indem Sie FCM (und unter Android Analytics) deaktivieren. Fügen Sie dazu auf Apple-Plattformen einen Metadatenwert zu Info.plist (nicht GoogleService-Info.plist) oder auf Android-Geräten zu AndroidManifest.xml hinzu:

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

Sie können FCM wieder aktivieren, indem Sie einen Runtime-Aufruf ausführen:

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

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

Mit FCM können Nachrichten mit einem Deeplink an Ihre App gesendet werden. 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 erfassen. 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 mit einem Link zum von Ihnen angegebenen Schema und Host tippen, startet Ihre App die Aktivität mit diesem Intent-Filter, um den Link zu verarbeiten.

Nächste Schritte

Nachdem Sie die Client-App eingerichtet haben, können Sie mit Firebase Downstream- und Topic-Nachrichten senden. Weitere Informationen finden Sie in der Beispieldatei für den Schnellstart, die Sie herunterladen, ausführen und prüfen können.

Wenn Sie Ihrer App weitere, erweiterte Funktionen hinzufügen möchten, lesen Sie die Anleitungen zum Senden von Nachrichten von einem App-Server:

Für die Nutzung dieser Funktionen ist eine Serverimplementierung erforderlich.