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 eine zusätzliche Einrichtung erforderlich.
Firebase und das FCM SDK einrichten
Android
Fügen Sie Ihrem C++-Projekt Firebase hinzu, falls noch nicht geschehen.
In der verlinkten Einrichtungsanleitung findest du die Geräte- und App-Anforderungen für die Verwendung des Firebase C++ SDKs, einschließlich der Empfehlung, CMake zum Erstellen deiner App zu verwenden.
In die Datei
build.gradle
auf Projektebene muss das Maven-Repository von Google in die Abschnittebuildscript
undallprojects
aufgenommen werden.
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);
Definieren Sie eine Klasse, die die
firebase::messaging::Listener
-Schnittstelle implementiert.Initialisiere FCM und übergebe die App und einen erstellten Listener:
::firebase::messaging::Initialize(app, listener);
Apps, die das Google Play Services SDK verwenden, sollten das Gerät auf ein kompatibles Google Play Services-APK prüfen, bevor sie auf die Funktionen zugreifen. Weitere Informationen finden Sie unter APK der Google Play-Dienste prüfen.
iOS+
- Fügen Sie Ihrem C++-Projekt Firebase hinzu, falls noch nicht geschehen. So richten Sie Ihr Projekt für FCM ein:
- Fügen Sie in der Podfile Ihres Projekts die FCM-Abhängigkeit hinzu:
pod 'FirebaseMessaging'
- Ziehen Sie die
firebase.framework
- undfirebase_messaging.framework
-Frameworks aus dem Firebase C++ SDK in Ihr Xcode-Projekt.
- Fügen Sie in der Podfile Ihres Projekts die FCM-Abhängigkeit hinzu:
Laden Sie Ihren APNs-Authentifizierungsschlüssel in Firebase hoch. Wenn Sie noch keinen APN-Authentifizierungsschlüssel haben, erstellen Sie einen im Apple Developer Member Center.
-
Klicken Sie in der Firebase Console in Ihrem Projekt auf das Zahnradsymbol, dann auf Projekteinstellungen und dann auf den Tab Cloud Messaging.
-
Klicken Sie unter APNs-Authentifizierungsschlüssel im Abschnitt Konfiguration der iOS-App auf die Schaltfläche Hochladen.
-
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.
-
Konfigurieren Sie Ihr Xcode-Projekt so, dass Push-Benachrichtigungen aktiviert werden:
- Wählen Sie das Projekt im Navigationsbereich aus.
- Wählen Sie im Bearbeitungsbereich das Projektziel aus.
Wählen Sie im Bearbeitungsbereich den Tab Allgemein aus.
- Scrollen Sie nach unten zu Verknüpfte Frameworks und Bibliotheken und klicken Sie 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 wird nur in Xcode 8 und höher angezeigt und ist für diese Bibliothek erforderlich.
Wählen Sie im Bearbeitungsbereich den Tab Funktionen aus.
- Stellen Sie Push-Benachrichtigungen auf An.
- Scrollen Sie nach unten zu Hintergrundmodi und aktivieren Sie die Option.
- Wählen Sie unter Hintergrundmodi die Option Remote-Benachrichtigungen aus.
Firebase App-Objekt erstellen:
app = ::firebase::App::Create(::firebase::AppOptions());
Definieren Sie eine Klasse, die die
firebase::messaging::Listener
-Schnittstelle implementiert.Firebase Cloud Messaging initialisieren, indem Sie die App und einen erstellten Listener übergeben:
::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 Nachrichtenübermittlung 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 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 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, werden im Benachrichtigungsfeld angezeigt. Der Inhalt dieser Benachrichtigung wird jedoch nicht an FCM gesendet. Das heißt, Message::notification
ist null.
Zusammenfassung:
App-Status | Benachrichtigung | Daten | Beides |
---|---|---|---|
Vordergrund | OnMessageReceived |
OnMessageReceived |
OnMessageReceived |
Hintergrund | Infobereich | OnMessageReceived |
Benachrichtigung: Infobereich Daten: in den Extras der Intent-Datei. |
Benutzerdefinierte Nachrichtenverarbeitung unter Android
Standardmäßig werden an die App gesendete Benachrichtigungen an ::firebase::messaging::Listener::OnMessageReceived
weitergeleitet. 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.
ListenerService
-Methoden überschreiben.
Die ListenerService
ist die Java-Klasse, die eingehende Nachrichten an die App 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 die Standard-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. Hier ein Beispiel:
<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 den Standard-ListenerService
und fügen den benutzerdefinierten Dienst hinzu. Das geht mit den 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 Festlegen auch nach App-Neustarts erhalten.
Umgang mit Nachrichten mit Deeplinks auf Android-Geräten
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 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 mit Firebase Downstream- und Themennachrichten senden. Weitere Informationen finden Sie in der Beispieldatei für den Schnellstart, die Sie herunterladen, ausführen und prüfen können.
Wenn Sie Ihrer App weitere, erweiterte Funktionen 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.