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

Wenn Sie Ihre plattformübergreifende Firebase Cloud Messaging-Clientanwendung 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.

Firebase und das FCM SDK einrichten

Android

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

    • In der verlinkten Einrichtungsanleitung finden Sie 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 firebase::messaging::Listener-Schnittstelle implementiert.

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

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

  5. Bei Apps, die auf dem Google Play Services SDK basieren, sollte vor dem Zugriff auf die Funktionen geprüft werden, ob auf dem Gerät ein kompatibles Google Play-Dienste-APK vorhanden ist. Weitere Informationen finden Sie unter Google Play-Dienste-APK prüfen.

iOS+

  1. Fügen Sie Firebase zu Ihrem C++-Projekt hinzu, falls noch nicht geschehen. So richten Sie Ihr Projekt für FCM ein:
    1. Fügen Sie die FCM-Abhängigkeit in das Podfile Ihres Projekts ein:
      pod 'FirebaseMessaging'
    2. Ziehen Sie die Frameworks firebase.framework und firebase_messaging.framework 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, müssen Sie einen im Apple Developer Member Center erstellen.

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

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

    3. Suchen Sie nach dem 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. So konfigurieren Sie Ihr Xcode-Projekt, um Push-Benachrichtigungen zu aktivieren:

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

      1. Scrolle nach unten zu Linked Frameworks and Libraries (Verknüpfte Frameworks und Bibliotheken) und klicke dann 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 ist nur in Xcode 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. Scrolle nach unten zu Hintergrundmodi und aktiviere 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. Initialisieren Sie Firebase Cloud Messaging und übergeben Sie die App und einen erstellten Listener:

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

Auf das Geräteregistrierungstoken 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, der in der Klasse definiert werden sollte, die firebase::messaging::Listener implementiert.

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

Hinweis zur Nachrichtenzustellung unter Android

Wenn die App überhaupt 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 Intent an 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 die App im Hintergrund ausgeführt wird, wird der Inhalt des Benachrichtigungsfelds verwendet, um die Benachrichtigung in der Taskleiste zu füllen. Dieser Benachrichtigungsinhalt wird jedoch nicht an FCM weitergegeben. Das heißt, Message::notification ist null.

Zusammenfassung:

App-Status Benachrichtigung Daten Beides
Vordergrund OnMessageReceived OnMessageReceived OnMessageReceived
Hintergrund Taskleiste OnMessageReceived Benachrichtigung: Taskleiste
Daten: in den Extras des Intents.

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

Überschreiben Sie die ListenerService-Methoden.

Die 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 im Hintergrund ausgeführt wird und eine Nutzlast mit reinen Daten empfängt), werden Nachrichten über einen der in dieser Klasse bereitgestellten Callbacks übergeben. Wenn Sie der Nachrichtenverarbeitung 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 {

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 bietet auch einige andere Methoden, die seltener verwendet werden. Diese können auch überschrieben werden. Weitere Informationen finden Sie in der FirebaseMessagingService-Referenz.

@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 die benutzerdefinierten Klassen geschrieben haben, müssen sie in die AndroidManifest.xml aufgenommen werden, damit sie wirksam werden. Achten Sie darauf, dass das Manifest die Merge-Tools enthält, indem Sie das entsprechende Attribut im <manifest>-Tag deklarieren:

<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 befindet sich eine AndroidManifest.xml-Datei, in der die Standard-ListenerService von FCM deklariert werden. Dieses Manifest wird normalerweise mit dem projektspezifischen Manifest zusammengeführt, wodurch die ListenerService ausgeführt werden kann. ListenerService muss durch den benutzerdefinierten Listener-Dienst ersetzt werden. Dazu entfernen Sie die Standard-ListenerService und fügen den benutzerdefinierten Dienst hinzu. Das kann mit den folgenden Zeilen in der AndroidManifest.xml-Datei Ihres Projekts erfolgen:

<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. Dies erfordert zusätzliche Änderungen in der Datei AndroidManifest.xml.

<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 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 zu Ihrem Info.plist (nicht zu Ihrem GoogleService-Info.plist) auf Apple-Plattformen oder zu Ihrem AndroidManifest.xml auf Android 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

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

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

Dieser Wert bleibt nach dem Festlegen auch nach dem Neustart der App erhalten.

Mit FCM können Nachrichten mit einem Deeplink zu Ihrer 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 abfangen. Wenn Ihre Nachrichten keinen Deeplink enthalten, ist diese Konfiguration nicht erforderlich. In der Datei „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 Client-App eingerichtet haben, können Sie Downstream- und Themennachrichten mit Firebase senden. Weitere Informationen finden Sie in der Kurzanleitung, die Sie herunterladen, ausführen und ansehen können.

Wenn Sie Ihrer App weitere, komplexere Verhaltensweisen 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.