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 Setups erforderlich sind.

Richten Sie Firebase und das FCM SDK ein

Android

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

    • Sehen Sie sich in den verlinkten Einrichtungsanweisungen die Geräte- und App-Anforderungen für die Verwendung des Firebase C++ SDK an, 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 Ihren buildscript als auch in Ihren allprojects Abschnitten einschließen.

  2. Erstellen Sie ein Firebase-App-Objekt und übergeben Sie dabei die JNI-Umgebung und 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, indem Sie die App und einen erstellten Listener übergeben:

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

  5. Apps, die auf das Google Play Services SDK angewiesen sind, sollten das Gerät auf ein kompatibles Google Play Services APK überprüfen, bevor sie auf die Funktionen zugreifen. Weitere Informationen finden Sie unter Nach Google Play-Diensten suchen APK .

iOS+

  1. Sie benötigen ein gültiges APNs -Zertifikat. Wenn Sie noch keins haben, stellen Sie sicher, dass Sie eines im Apple Developer Member Center erstellen.
  2. Falls noch nicht geschehen, fügen Sie Firebase zu Ihrem C++-Projekt hinzu . Anschließend richten Sie Ihr Projekt für FCM ein:
    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 Navigatorbereich aus.
    2. Wählen Sie im Editorbereich das Projektziel aus.
    3. Wählen Sie im Editorbereich die Registerkarte „Allgemein“ aus.

      1. Scrollen Sie nach unten zu „Verknüpfte Frameworks und Bibliotheken“ 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 Editorbereich die Registerkarte „Funktionen“ aus.

      1. Schalten Sie Push-Benachrichtigungen auf Ein .
      2. Scrollen Sie nach unten zu „Hintergrundmodi“ und schalten Sie es dann auf „Ein“ .
      3. Wählen Sie unter „Hintergrundmodi“ die Option „Fernbenachrichtigungen“ 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 erstellten 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 empfängt das Token mit dem OnTokenReceived Rückruf, der in der Klasse definiert werden sollte, die firebase::messaging::Listener implementiert.

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

Hinweis zur Nachrichtenzustellung auf Android

Wenn die App überhaupt nicht ausgeführt wird und ein Benutzer auf eine Benachrichtigung tippt, wird die Nachricht standardmäßig nicht über die integrierten Rückrufe 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++-Bibliotheksrückruf weiterleitet, müssen Sie die Methode onNewIntent in Ihrer Aktivität überschreiben und den 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 zum Ausfüllen der Taskleistenbenachrichtigung verwendet. Dieser Benachrichtigungsinhalt wird jedoch nicht an FCM übermittelt. Das heißt, Message::notification wird eine Null sein.

In Summe:

App-Status Benachrichtigung Daten Beide
Vordergrund OnMessageReceived OnMessageReceived OnMessageReceived
Hintergrund System Tray OnMessageReceived Benachrichtigung: Taskleiste
Daten: in Extras der Absicht.

Benutzerdefinierte Nachrichtenverarbeitung auf Android

Standardmäßig werden an die App gesendete Benachrichtigungen an ::firebase::messaging::Listener::OnMessageReceived weitergeleitet. In einigen Fällen möchten Sie jedoch möglicherweise das Standardverhalten ü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 läuft und eine Nur-Daten-Nutzlast empfängt), werden Nachrichten über einen der in dieser Klasse bereitgestellten Rückrufe weitergeleitet. Um der Nachrichtenverarbeitung 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 verfügt auch über einige andere Methoden, die weniger häufig 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);
}

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ührungstools enthält, indem Sie das entsprechende Attribut im <manifest> -Tag deklarieren, etwa so:

<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 AndroidManifest.xml Datei, die den Standard- 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 Sie den standardmäßigen ListenerService entfernen und den benutzerdefinierten Service hinzufügen. Dies 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>

Neue Versionen des 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>

Verhindern Sie die automatische Initialisierung

FCM generiert ein Registrierungstoken für das Geräte-Targeting. Wenn ein Token generiert wird, lädt die Bibliothek die Kennung und Konfigurationsdaten in Firebase hoch. Wenn Sie vor der Verwendung des Tokens eine explizite Einwilligung einholen 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 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 durchführen:

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

Dieser Wert bleibt über App-Neustarts hinweg bestehen, sobald er festgelegt wurde.

Mit FCM können Nachrichten gesendet werden, die einen Deep-Link zu Ihrer App enthalten. Um Nachrichten zu empfangen, die einen Deep-Link enthalten, müssen Sie der Aktivität, die Deep-Links für Ihre App verarbeitet, einen neuen Absichtsfilter hinzufügen. Der Intent-Filter sollte Deep-Links Ihrer Domain erfassen. Wenn Ihre Nachrichten keinen Deep Link enthalten, ist diese Konfiguration nicht notwendig. 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 Themennachrichten mit Firebase senden. Weitere Informationen finden Sie in der Demonstration dieser Funktionalität im Schnellstartbeispiel , das Sie herunterladen, ausführen und überprüfen können.

Informationen zum Hinzufügen weiterer, erweiterter Verhaltensweisen zu Ihrer App finden Sie in den Anleitungen zum Senden von Nachrichten von einem App-Server:

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