Ich habe darüber geschrieben, wie man Firebase Cloud Messaging verwendet, um Push-Benachrichtigungen für Android-Apps einzuführen. In diesem Eintrag schreibe ich den Code, der erforderlich ist, um die Benachrichtigung tatsächlich zu erhalten, und fasse den Vorgang bis zum Erhalt der Benachrichtigung zusammen.
Es gibt zwei Arten von FCM-Nachrichten: Weitere Informationen finden Sie unter hier.
Nachrichtentyp | Überblick |
---|---|
Benachrichtigungsnachricht | Nachrichten, die von FCM im Auftrag der App verarbeitet werden. Da es mit einem vordefinierten Schlüssel gesendet wird, ist es nicht möglich, andere als die angegebenen Informationen zu senden. |
Datennachricht | Nachrichten, die die App direkt verarbeitet. Der Absender kann das Format der Nachricht frei bestimmen, z. B. den Schlüssel der Nachricht. |
Es gibt zwei Hauptunterschiede zwischen den beiden.
Das Verhalten der App beim Empfang einer Nachricht ist wie folgt. In dem Fall, in dem "onMessageReceived" geschrieben ist, onMessageReceived-Dienstmethode, die die FirebaseMessagingService-Klasse erbt #onMessageReceived (com.google.firebase.messaging.RemoteMessage)) wird aufgerufen.
Nachrichtentyp | Die App steht im Vordergrund | App ist im Hintergrund |
---|---|---|
Benachrichtigungsnachricht | Betreten Sie die Taskleiste | onMessageReceived |
Datennachricht | onMessageReceived | onMessageReceived |
Benachrichtigungsnachrichten können auch Daten enthalten. Informationen zur Verwendung beider zusammen finden Sie unter hier.
Firebase wurde dem Android-Projekt hinzugefügt. Informationen zum Hinzufügen finden Sie im vorherigen Eintrag (https://qiita.com/outerlet/items/e3fe96a3d1e15ed42573).
Es wird in der folgenden Umgebung ausgeführt.
Erstellen Sie einen Dienst, der von [FirebaseMessagingService] erbt (https://firebase.google.com/docs/reference/android/com/google/firebase/messaging/FirebaseMessagingService). Dieser Dienst implementiert die folgenden zwei Methoden (es gibt andere Methoden, die implementiert werden können, die hier jedoch weggelassen werden).
Methode | Timing aufgerufen werden |
---|---|
onNewToken | Das Token (Zeichenfolge zur eindeutigen Identifizierung der Kombination aus Terminal + Anwendung) wurde aktualisiert |
onMessageReceived | Erhielt eine Benachrichtigung |
Ich habe versucht, jede Methode zu implementieren. Wenn das Token aktualisiert wird, ist normalerweise eine Verarbeitung wie das Speichern auf dem Server erforderlich, aber hier wird es nur protokolliert.
MyFirebaseMessagingService.java
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onNewToken(String token) {
//Holen Sie sich ein Token, um das Gerät + die App eindeutig zu identifizieren
Log.i("FIREBASE", "[SERVICE] Token = " + token);
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
if (remoteMessage != null) {
//Benachrichtigungsnachricht
RemoteMessage.Notification notification = remoteMessage.getNotification();
if (notification != null) {
//Behandeln Sie Benachrichtigungsnachrichten
}
//Datennachricht
Map<String, String> data = remoteMessage.getData();
if (data != null) {
//Datenmeldungen verarbeiten
}
}
}
}
MyFirebaseMessagingService.kt
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onNewToken(token: String?) {
//Holen Sie sich ein Token, um das Gerät + die App eindeutig zu identifizieren
Log.i("FIREBASE", "[SERVICE] Token = ${token ?: "Empty"}")
}
override fun onMessageReceived(remoteMessage: RemoteMessage?) {
remoteMessage?.let { message ->
//Benachrichtigungsnachricht
message.notification?.let {
//Behandeln Sie Benachrichtigungsnachrichten
}
//Datennachricht
message.data?.let {
//Datenmeldungen verarbeiten
}
}
}
}
Registrieren Sie den erstellten Dienst in AndroidManifest.xml.
AndroidManifest.xml
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
"Terminalregistrierungstoken" (im Folgenden "Token") ist eine Zeichenfolge zur eindeutigen Identifizierung der Kombination von Terminal + Anwendung. Verwenden Sie diese Option, um eine Nachricht an die App zu senden. Das Token kann ** aufgrund von Benutzer- oder serverseitigen Umständen ** aktualisiert werden. Es wird empfohlen, immer das neueste Token zu erhalten. Ich halte es daher für angebracht, es so zu implementieren, dass es beim Start der Anwendung bestätigt wird. Der Code zum Abrufen des Tokens ist unten.
Holen Sie sich Token(Java)
FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener((task) -> {
if (!task.isSuccessful()) {
Log.w("FIREBASE", "getInstanceId failed.", task.getException());
return;
}
String token = (task.getResult() == null) ? "empty" : task.getResult().getToken();
Log.i("FIREBASE", "[CALLBACK] Token = " + token);
});
Holen Sie sich Token(Kotlin)
FirebaseInstanceId.getInstance().instanceId.addOnCompleteListener { task ->
if (!task.isSuccessful) {
Log.w("FIREBASE", "getInstanceId failed", task.exception)
return@addOnCompleteListener
}
Log.i("FIREBASE", "[CALLBACK] Token = ${task.result?.token}")
}
Wenn eine Nachricht empfangen wird, wird onMessageReceived (RemoteMessage) aufgerufen, das in einer Unterklasse von FirebaseMessagingService implementiert ist. Darin definieren Sie die Logik zum Parsen und Behandeln der Nachricht. Der Beispielcode im Abschnitt "Service Definition" entspricht jeder Benachrichtigungsnachricht und Datennachricht. bitte bestätigen.
An diesem Punkt sind Sie bereit, die Nachricht zu empfangen. Sie können eine Nachricht mit der Firebase-Konsole oder einer HTTP-Anfrage senden. Probieren Sie es aus.
Um eine Benachrichtigung zu senden, melden Sie sich bei der Firebase-Konsole an, öffnen Sie das gewünschte Projekt und gehen Sie zu "Cloud Messaging". Klicken Sie auf "Erste Nachricht senden".
Wenn es das zweite Mal oder später ist, werden die bisher gesendeten Nachrichten aufgelistet. Klicken Sie oben links auf dem Bildschirm auf "Neue Benachrichtigung", um eine neue Nachricht zu senden. Sie können auch eine vorhandene Nachricht duplizieren.
Verwenden Sie dann cURL, um sowohl die Benachrichtigungsnachricht als auch die Datennachricht zu senden. Ich werde die Einführung und Verwendung von cURL weglassen.
Überprüfen Sie den Serverschlüssel. Klicken Sie in der Firebase-Konsole auf das zahnradförmige Einstellungssymbol ①, um den Bildschirm zu öffnen. Klicken Sie im Einstellungsbildschirm auf die Registerkarte "Cloud Messaging" ②. "Serverschlüssel" ③ wird angezeigt, machen Sie also eine Kopie davon.
Das Folgende ist ein Beispiel für einen Befehl zum Senden einer Datennachricht.
SERVER_KEY=(Serverschlüssel)
TARGET_TOKEN=(Zeichen)
curl -X POST -H "Content-Type:application/json" \
-H "Authorization:key=$SERVER_KEY" \
-d "{\"data\":{\"name\" : \"Taro Nihon\",\"age\" : \"20\",\"address\" : \"Tokyo\"},\"to\" : \"$TARGET_TOKEN\"}" \
https://fcm.googleapis.com/fcm/send
Ich habe vom Schreiben des Codes bis zum Empfang der Nachricht geschrieben. Obwohl die FCM-Nachricht hier mit dem Mindestinhalt erstellt wird, kann sie verschiedene andere Informationen wie Ablaufdatum und Priorität enthalten. Bitte beachten Sie Folgendes und probieren Sie verschiedene Implementierungen aus.