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
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 Ihrembuildscript
als auch inallprojects
Abschnitten enthalten.
Erstellen Sie ein Firebase-App-Objekt und übergeben Sie die JNI-Umgebung und Activity:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
Definieren Sie eine Klasse, die die Schnittstelle
firebase::messaging::Listener
implementiert.Initialisieren Sie FCM, übergeben Sie die App und einen konstruierten Listener:
::firebase::messaging::Initialize(app, listener);
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+
- 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.
- Fügen Sie Ihrem C++-Projekt Firebase hinzu , falls Sie dies noch nicht getan haben . Dann, um Ihr Projekt für FCM einzurichten:
- Fügen Sie in der Poddatei Ihres Projekts die FCM-Abhängigkeit hinzu:
pod 'FirebaseMessaging'
- Ziehen Sie die Frameworks
firebase.framework
undfirebase_messaging.framework
aus dem Firebase C++ SDK in Ihr Xcode-Projekt.
- Fügen Sie in der Poddatei Ihres Projekts die FCM-Abhängigkeit hinzu:
Konfigurieren Sie Ihr Xcode-Projekt, um Push-Benachrichtigungen zu aktivieren:
- Wählen Sie das Projekt im Bereich Navigator aus.
- Wählen Sie im Bereich Editor das Projektziel aus.
Wählen Sie im Bereich Editor die Registerkarte Allgemein aus.
- Scrollen Sie nach unten zu Linked Frameworks and Libraries und klicken Sie dann auf die Schaltfläche + , um Frameworks hinzuzufügen.
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.
Wählen Sie im Bereich Editor die Registerkarte Funktionen aus.
- Schalten Sie Push-Benachrichtigungen auf Ein .
- Scrollen Sie nach unten zu Hintergrundmodi und schalten Sie ihn dann auf Ein .
- Wählen Sie Remotebenachrichtigungen unter Hintergrundmodi aus.
Erstellen Sie ein Firebase-App-Objekt:
app = ::firebase::App::Create(::firebase::AppOptions());
Definieren Sie eine Klasse, die die Schnittstelle
firebase::messaging::Listener
implementiert.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.
Umgang mit Nachrichten mit Deep Links auf Android
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.