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 einige zusätzliche Einrichtung erforderlich.

Firebase und das FCM SDK einrichten

Android

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

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

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

  2. Erstelle ein Firebase App-Objekt und übergebe 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. 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 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 du noch keinen APNs-Authentifizierungsschlüssel hast, erstelle 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 im Bereich APNs-Authentifizierungsschlüssel unter iOS-App-Konfiguration 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 aus dem Navigatorbereich 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 setzen Sie den Schalter auf An.
      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 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 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 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 Callbacks von FCM weitergeleitet. In diesem Fall werden Nachrichtennutzlasten über ein Intent empfangen, das zum Starten der Anwendung verwendet wird. Damit FCM diese eingehenden Nachrichten an den Callback der C++-Bibliothek weiterleitet, musst du die Methode onNewIntent in deiner 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, enthalten den Inhalt des Benachrichtigungsfelds, das zum Ausfüllen der Taskleistenbenachrichtigung verwendet wird. Dieser Benachrichtigungsinhalt wird jedoch nicht an FCM übermittelt. Das heißt, Message::notification ist null.

Zusammenfassung:

App-Status Benachrichtigung Daten Beides
Vordergrund OnMessageReceived OnMessageReceived OnMessageReceived
Hintergrund Infobereich OnMessageReceived Benachrichtigung: Taskleiste
Daten: in 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 kann es jedoch erforderlich sein, das Standardverhalten zu ü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, die an die Anwendung gesendet werden, 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 den standardmäßigen 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 die Standardeinstellung ListenerService und fügen den benutzerdefinierten Dienst hinzu. Verwenden Sie dazu die 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 Neustart der App 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 Downstream- und Themennachrichten mit Firebase senden. Weitere Informationen finden Sie in der Beispieldatei für den Schnellstart, die Sie herunterladen, ausführen und prüfen können.

Informationen zum Hinzufügen weiterer komplexerer Verhaltensweisen zu Ihrer Anwendung finden Sie in den Leitfäden zum Senden von Nachrichten von einem Anwendungsserver:

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