Catch up on highlights from Firebase at Google I/O 2023. Learn more

Richten Sie eine Firebase Cloud Messaging-Client-App mit C++ ein

Um Ihre plattformübergreifende Firebase Cloud Messaging-Client-App mit C++ zu schreiben, verwenden Sie die Firebase Cloud Messaging- API. Das C++ SDK funktioniert sowohl für Android- als auch für Apple-Plattformen, wobei für jede Plattform einige zusätzliche Einstellungen erforderlich sind.

Richten Sie Firebase und das FCM SDK ein

Android

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

    • Lesen Sie in den verknüpften Einrichtungsanweisungen 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.

    • Stellen Sie in Ihrer build.gradle -Datei auf Projektebene sicher, dass Sie das Maven-Repository von Google sowohl in Ihrem buildscript als auch in allprojects Abschnitten enthalten.

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

    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, übergeben Sie die App und einen konstruierten Listener:

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

  5. Apps, die auf das Google Play-Dienste-SDK angewiesen sind, sollten das Gerät auf ein kompatibles Google Play-Dienste-APK prüfen, bevor sie auf die Funktionen zugreifen. Weitere Informationen finden Sie unter Auf Google Play-Dienste prüfen APK .

iOS+

  1. Sie benötigen ein gültiges APNs -Zertifikat. Wenn Sie noch keines haben, stellen Sie sicher, dass Sie eines im Apple Developer Member Center erstellen.
  2. Fügen Sie Ihrem C++-Projekt Firebase hinzu , falls Sie dies noch nicht getan haben . Dann, um Ihr Projekt für FCM einzurichten:
    1. Fügen Sie in der Poddatei Ihres Projekts die FCM-Abhängigkeit hinzu:
      pod 'FirebaseMessaging'
    2. Ziehen Sie die Frameworks firebase.framework und firebase_messaging.framework aus dem Firebase C++ SDK in Ihr Xcode-Projekt.
  3. Konfigurieren Sie Ihr Xcode-Projekt, um Push-Benachrichtigungen zu aktivieren:

    1. Wählen Sie das Projekt im Bereich Navigator aus.
    2. Wählen Sie im Bereich Editor das Projektziel aus.
    3. Wählen Sie im Bereich Editor die Registerkarte Allgemein aus.

      1. Scrollen Sie nach unten zu Linked Frameworks and Libraries und klicken Sie 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 erscheint nur in Xcode v8 und höher und wird von dieser Bibliothek benötigt.

    4. Wählen Sie im Bereich Editor die Registerkarte Funktionen aus.

      1. Schalten Sie Push-Benachrichtigungen auf Ein .
      2. Scrollen Sie nach unten zu Hintergrundmodi und schalten Sie ihn dann auf Ein .
      3. Wählen Sie Remotebenachrichtigungen unter Hintergrundmodi 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, indem Sie die App und einen konstruierten Listener übergeben:

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

Greifen Sie auf das Geräteregistrierungstoken zu

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 sein sollte, die firebase::messaging::Listener implementiert.

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

Hinweis zur Nachrichtenübermittlung auf Android

Wenn die App überhaupt nicht ausgeführt wird und ein Benutzer auf eine Benachrichtigung tippt, wird die Nachricht standardmäßig nicht durch die integrierten Rückrufe von FCM geleitet. In diesem Fall werden Nachrichtennutzdaten über eine Intent empfangen, die zum Starten der Anwendung verwendet wird. Damit FCM diese eingehenden Nachrichten an den Callback der C++-Bibliothek weiterleitet, müssen Sie die Methode onNewIntent in Ihrer Aktivität überschreiben und die 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 sich die App im Hintergrund befindet, wird der Inhalt ihres Benachrichtigungsfelds verwendet, um die Benachrichtigung in der Taskleiste zu füllen, aber dieser Benachrichtigungsinhalt wird nicht an FCM übermittelt. Das heißt, Message::notification ist eine Null.

In Summe:

App-Zustand Benachrichtigung Daten Beide
Vordergrund OnMessageReceived OnMessageReceived OnMessageReceived
Hintergrund System Tray OnMessageReceived Benachrichtigung: Taskleiste
Daten: in den Extras des Vorsatzes.

Benutzerdefinierte Nachrichtenbehandlung auf Android

Standardmäßig werden an die App gesendete Benachrichtigungen an ::firebase::messaging::Listener::OnMessageReceived übergeben, aber in einigen Fällen möchten Sie das Standardverhalten möglicherweise überschreiben. Um dies auf Android zu tun, müssen Sie benutzerdefinierte Klassen schreiben, die com.google.firebase.messaging.cpp.ListenerService erweitern, und AndroidManifest.xml Ihres Projekts aktualisieren.

ListenerService Methoden überschreiben.

Der ListenerService ist die Java-Klasse, die an die App gesendete eingehende Nachrichten abfängt und sie an die C++-Bibliothek weiterleitet. Wenn sich die App im Vordergrund befindet (oder wenn die App im Hintergrund ist und eine Nur-Daten-Nutzlast empfängt), werden Nachrichten durch einen der in dieser Klasse bereitgestellten Rückrufe geleitet. Um der Nachrichtenbehandlung ein benutzerdefiniertes Verhalten hinzuzufügen, müssen Sie den standardmäßigen 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 hat auch einige andere Methoden, die weniger häufig verwendet werden. Diese können ebenfalls ü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);
}

Aktualisieren Sie AndroidManifest.xml

Sobald Ihre benutzerdefinierten Klassen geschrieben wurden, müssen sie in die AndroidManifest.xml aufgenommen werden, damit sie wirksam werden. Stellen Sie sicher, dass das Manifest die Zusammenführungswerkzeuge enthält, indem Sie das entsprechende Attribut innerhalb des <manifest> -Tags wie folgt 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 Archiv firebase_messaging_cpp.aar gibt es eine Datei AndroidManifest.xml , die den standardmäßigen ListenerService von FCM deklariert. 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. Dies wird erreicht, indem der standardmäßige ListenerService entfernt und der benutzerdefinierte Dienst hinzugefügt wird, was mit den folgenden Zeilen in AndroidManifest.xml Datei Ihres Projekts erfolgen kann:

<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 von Firebase C++ SDK (ab 7.1.0) verwenden JobIntentService , 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 das Geräte-Targeting. 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 erhalten möchten, können Sie die Generierung zum Zeitpunkt der Konfiguration verhindern, indem Sie FCM (und auf Android Analytics) deaktivieren. Fügen Sie dazu einen Metadatenwert zu Ihrer Info.plist (nicht zu Ihrer GoogleService-Info.plist ) auf Apple-Plattformen oder zu Ihrer 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>

Schnell

FirebaseMessagingAutoInitEnabled = NO

Um FCM wieder zu aktivieren, können Sie einen Laufzeitaufruf tätigen:

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

Dieser Wert bleibt nach dem Festlegen über App-Neustarts hinweg bestehen.

FCM ermöglicht das Versenden von Nachrichten mit einem Deep-Link in Ihre App. Um Nachrichten zu erhalten, die einen Deep-Link enthalten, müssen Sie der Aktivität, die Deep-Links für Ihre App verarbeitet, einen neuen Intent-Filter hinzufügen. Der Intent-Filter sollte Deep-Links 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>

Es ist auch möglich, einen Platzhalter anzugeben, um den Intent-Filter flexibler zu gestalten. Zum 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 Benutzer auf eine Benachrichtigung tippen, die einen Link zu dem von Ihnen angegebenen Schema und Host enthält, startet Ihre App die Aktivität mit diesem Absichtsfilter, um den Link zu verarbeiten.

Nächste Schritte

Nachdem Sie die Client-App eingerichtet haben, können Sie Downstream- und Topic-Nachrichten mit Firebase senden. Um mehr zu erfahren, sehen Sie sich diese Funktionalität demonstriert im Quickstart-Beispiel an, das Sie herunterladen, ausführen und überprüfen können.

Um Ihrer App andere, fortgeschrittenere Verhaltensweisen hinzuzufügen, lesen Sie die Anleitungen zum Senden von Nachrichten von einem App-Server:

Denken Sie daran, dass Sie eine Serverimplementierung benötigen, um diese Funktionen nutzen zu können.