Themenbezogenes Messaging unter Android

Basierend auf dem Publish/Subscribe-Modell können Sie mit FCM-Topic-Messaging eine Nachricht an mehrere Geräte senden, die für ein bestimmtes Thema aktiviert sind. Sie verfassen nach Bedarf Nachrichten zu Themen und FCM kümmert sich um das Routing und die zuverlässige Zustellung der Nachricht an die richtigen Geräte.

Nutzer einer lokalen Gezeiten-Prognose-App können beispielsweise das Thema „Benachrichtigungen über Gezeitenströme“ aktivieren und Benachrichtigungen zu optimalen Bedingungen zum Fischfang mit Salzwasser in bestimmten Gebieten erhalten. Nutzer einer Sport-App könnten automatische Updates zu den Live-Spielständen ihrer Lieblingsteams abonnieren.

Beachten Sie bei Themen Folgendes:

  • Themennachrichten eignen sich am besten für Inhalte wie Wettervorhersagen oder andere öffentlich verfügbare Informationen.
  • Themennachrichten sind im Hinblick auf den Durchsatz und nicht für die Latenz optimiert. Für eine schnelle und sichere Zustellung an einzelne Geräte oder kleine Gruppen von Geräten sollten Sie Nachrichten nicht auf Themen, sondern auf Registrationstokens ausrichten.
  • Wenn Sie Nachrichten pro Nutzer an mehrere Geräte senden möchten, sollten Sie für diese Anwendungsfälle Nachrichten an Gerätegruppen verwenden.
  • Beim themenbezogenen Messaging werden für jedes Thema unbegrenzt viele Abos unterstützt. FCM erzwingt jedoch Limits in den folgenden Bereichen:
    • Für eine Anwendungsinstanz können nicht mehr als 2.000 Themen abonniert werden.
    • Wenn Sie den Batchimport verwenden, um App-Instanzen zu abonnieren, ist jede Anfrage auf 1.000 App-Instanzen beschränkt.
    • Die Häufigkeit neuer Abos ist pro Projekt begrenzt. Wenn du innerhalb kurzer Zeit zu viele Aboanfragen sendest, antworten FCM-Server mit der Antwort 429 RESOURCE_EXHAUSTED („Kontingent überschritten“). Wiederholen Sie den Vorgang mit exponentiellem Backoff.

Clientanwendung für ein Thema abonnieren

Clientanwendungen können jedes vorhandene Thema abonnieren oder ein neues Thema erstellen. Wenn eine Client-App einen neuen Themennamen abonniert, der für Ihr Firebase-Projekt noch nicht vorhanden ist, wird in FCM ein neues Thema mit diesem Namen erstellt. Dieses kann dann von allen Clients abonniert werden.

Um ein Thema zu abonnieren, ruft die Clientanwendung Firebase Cloud Messaging subscribeToTopic() mit dem Namen des Themas FCM auf. Diese Methode gibt eine Task zurück, mit der ein Abschluss-Listener feststellen kann, ob das Abo erfolgreich war:

Kotlin+KTX

Firebase.messaging.subscribeToTopic("weather")
    .addOnCompleteListener { task ->
        var msg = "Subscribed"
        if (!task.isSuccessful) {
            msg = "Subscribe failed"
        }
        Log.d(TAG, msg)
        Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
    }

Java

FirebaseMessaging.getInstance().subscribeToTopic("weather")
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                String msg = "Subscribed";
                if (!task.isSuccessful()) {
                    msg = "Subscribe failed";
                }
                Log.d(TAG, msg);
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });

Um sich abzumelden, ruft die Clientanwendung Firebase Cloud Messaging unsubscribeFromTopic() mit dem Namen des Themas auf.

Themenabos auf dem Server verwalten

Mit der Firebase Admin SDK können Sie grundlegende Aufgaben zur Themenverwaltung serverseitig ausführen. Anhand der Registrierungstoken kannst du Client-App-Instanzen mithilfe von Serverlogik im Bulk-Verfahren abonnieren und kündigen.

Sie können Client-App-Instanzen für ein beliebiges vorhandenes Thema abonnieren oder ein neues Thema erstellen. Wenn Sie eine Client-App über die API für ein neues Thema abonnieren, das für Ihr Firebase-Projekt noch nicht vorhanden ist, wird in FCM ein neues Thema mit diesem Namen erstellt. Dieses kann dann von jedem Client abonniert werden.

Sie können der Firebase Admin SDK-Abomethode eine Liste von Registrierungstokens übergeben, um die entsprechenden Geräte für ein Thema zu abonnieren:

Node.js

// These registration tokens come from the client FCM SDKs.
const registrationTokens = [
  'YOUR_REGISTRATION_TOKEN_1',
  // ...
  'YOUR_REGISTRATION_TOKEN_n'
];

// Subscribe the devices corresponding to the registration tokens to the
// topic.
getMessaging().subscribeToTopic(registrationTokens, topic)
  .then((response) => {
    // See the MessagingTopicManagementResponse reference documentation
    // for the contents of response.
    console.log('Successfully subscribed to topic:', response);
  })
  .catch((error) => {
    console.log('Error subscribing to topic:', error);
  });

Java

// These registration tokens come from the client FCM SDKs.
List<String> registrationTokens = Arrays.asList(
    "YOUR_REGISTRATION_TOKEN_1",
    // ...
    "YOUR_REGISTRATION_TOKEN_n"
);

// Subscribe the devices corresponding to the registration tokens to the
// topic.
TopicManagementResponse response = FirebaseMessaging.getInstance().subscribeToTopic(
    registrationTokens, topic);
// See the TopicManagementResponse reference documentation
// for the contents of response.
System.out.println(response.getSuccessCount() + " tokens were subscribed successfully");

Python

# These registration tokens come from the client FCM SDKs.
registration_tokens = [
    'YOUR_REGISTRATION_TOKEN_1',
    # ...
    'YOUR_REGISTRATION_TOKEN_n',
]

# Subscribe the devices corresponding to the registration tokens to the
# topic.
response = messaging.subscribe_to_topic(registration_tokens, topic)
# See the TopicManagementResponse reference documentation
# for the contents of response.
print(response.success_count, 'tokens were subscribed successfully')

Go

// These registration tokens come from the client FCM SDKs.
registrationTokens := []string{
	"YOUR_REGISTRATION_TOKEN_1",
	// ...
	"YOUR_REGISTRATION_TOKEN_n",
}

// Subscribe the devices corresponding to the registration tokens to the
// topic.
response, err := client.SubscribeToTopic(ctx, registrationTokens, topic)
if err != nil {
	log.Fatalln(err)
}
// See the TopicManagementResponse reference documentation
// for the contents of response.
fmt.Println(response.SuccessCount, "tokens were subscribed successfully")

C#

// These registration tokens come from the client FCM SDKs.
var registrationTokens = new List<string>()
{
    "YOUR_REGISTRATION_TOKEN_1",
    // ...
    "YOUR_REGISTRATION_TOKEN_n",
};

// Subscribe the devices corresponding to the registration tokens to the
// topic
var response = await FirebaseMessaging.DefaultInstance.SubscribeToTopicAsync(
    registrationTokens, topic);
// See the TopicManagementResponse reference documentation
// for the contents of response.
Console.WriteLine($"{response.SuccessCount} tokens were subscribed successfully");

Mit der Admin FCM API kannst du Geräte auch von einem Thema abmelden, indem du Registrierungstokens an die entsprechende Methode übergibst:

Node.js

// These registration tokens come from the client FCM SDKs.
const registrationTokens = [
  'YOUR_REGISTRATION_TOKEN_1',
  // ...
  'YOUR_REGISTRATION_TOKEN_n'
];

// Unsubscribe the devices corresponding to the registration tokens from
// the topic.
getMessaging().unsubscribeFromTopic(registrationTokens, topic)
  .then((response) => {
    // See the MessagingTopicManagementResponse reference documentation
    // for the contents of response.
    console.log('Successfully unsubscribed from topic:', response);
  })
  .catch((error) => {
    console.log('Error unsubscribing from topic:', error);
  });

Java

// These registration tokens come from the client FCM SDKs.
List<String> registrationTokens = Arrays.asList(
    "YOUR_REGISTRATION_TOKEN_1",
    // ...
    "YOUR_REGISTRATION_TOKEN_n"
);

// Unsubscribe the devices corresponding to the registration tokens from
// the topic.
TopicManagementResponse response = FirebaseMessaging.getInstance().unsubscribeFromTopic(
    registrationTokens, topic);
// See the TopicManagementResponse reference documentation
// for the contents of response.
System.out.println(response.getSuccessCount() + " tokens were unsubscribed successfully");

Python

# These registration tokens come from the client FCM SDKs.
registration_tokens = [
    'YOUR_REGISTRATION_TOKEN_1',
    # ...
    'YOUR_REGISTRATION_TOKEN_n',
]

# Unubscribe the devices corresponding to the registration tokens from the
# topic.
response = messaging.unsubscribe_from_topic(registration_tokens, topic)
# See the TopicManagementResponse reference documentation
# for the contents of response.
print(response.success_count, 'tokens were unsubscribed successfully')

Go

// These registration tokens come from the client FCM SDKs.
registrationTokens := []string{
	"YOUR_REGISTRATION_TOKEN_1",
	// ...
	"YOUR_REGISTRATION_TOKEN_n",
}

// Unsubscribe the devices corresponding to the registration tokens from
// the topic.
response, err := client.UnsubscribeFromTopic(ctx, registrationTokens, topic)
if err != nil {
	log.Fatalln(err)
}
// See the TopicManagementResponse reference documentation
// for the contents of response.
fmt.Println(response.SuccessCount, "tokens were unsubscribed successfully")

C#

// These registration tokens come from the client FCM SDKs.
var registrationTokens = new List<string>()
{
    "YOUR_REGISTRATION_TOKEN_1",
    // ...
    "YOUR_REGISTRATION_TOKEN_n",
};

// Unsubscribe the devices corresponding to the registration tokens from the
// topic
var response = await FirebaseMessaging.DefaultInstance.UnsubscribeFromTopicAsync(
    registrationTokens, topic);
// See the TopicManagementResponse reference documentation
// for the contents of response.
Console.WriteLine($"{response.SuccessCount} tokens were unsubscribed successfully");

Die Methoden subscribeToTopic() und unsubscribeFromTopic() ergeben ein Objekt, das die Antwort von FCM enthält. Der Rückgabetyp hat unabhängig von der Anzahl der in der Anfrage angegebenen Registrierungstokens dasselbe Format.

Bei einem Fehler (z. B. Authentifizierungsfehler, ungültiges Token oder Thema) führen diese Methoden zu einem Fehler. Eine vollständige Liste der Fehlercodes, einschließlich Beschreibungen und Schritten zur Fehlerbehebung, finden Sie unter Admin FCM API-Fehler.

Nachrichten zu Themen empfangen und bearbeiten

FCM stellt Themennachrichten auf dieselbe Weise zu wie andere nachgelagerte Nachrichten.

Verwenden Sie zum Empfangen von Nachrichten einen Dienst, der FirebaseMessagingService erweitert. Dein Dienst sollte die onMessageReceived- und onDeletedMessages-Callbacks überschreiben.

Das Zeitfenster für die Verarbeitung einer Nachricht kann kürzer als 20 Sekunden sein, je nach Verzögerungen vor dem Aufruf von onMessageReceived. Dazu gehören Verzögerungen des Betriebssystems, die App-Startzeit, das Blockieren des Hauptthreads durch andere Vorgänge oder zu lange vorherige onMessageReceived-Aufrufe. Danach können verschiedene Betriebssystemfunktionen wie das Beenden von Prozessen unter Android oder die Einschränkungen für die Hintergrundausführung unter Android O Ihre Arbeit beeinträchtigen.

onMessageReceived wird für die meisten Nachrichtentypen bereitgestellt, mit folgenden Ausnahmen:

  • Benachrichtigungen, die gesendet werden, wenn Ihre App im Hintergrund ausgeführt wird In diesem Fall wird die Benachrichtigung in der Taskleiste des Geräts angezeigt. Wenn ein Nutzer auf eine Benachrichtigung tippt, wird standardmäßig der App Launcher geöffnet.

  • Nachrichten mit Benachrichtigungs- und Datennutzlast, die im Hintergrund empfangen werden In diesem Fall wird die Benachrichtigung an das Info-Symbol des Geräts gesendet und die Datennutzlast wird in den Extras der Intent-Aktivität Ihrer Launcher-Aktivität gesendet.

Zusammenfassung:

App-Status Benachrichtigung Daten Beides
Vordergrund onMessageReceived onMessageReceived onMessageReceived
Hintergrund Infobereich onMessageReceived Benachrichtigung: Infobereich
Daten: in den Extras der Intent.
Weitere Informationen zu Nachrichtentypen finden Sie unter Benachrichtigungen und Datennachrichten.

App-Manifest bearbeiten

Wenn du FirebaseMessagingService verwenden möchtest, musst du Folgendes in dein App-Manifest einfügen:

<service
    android:name=".java.MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

Außerdem empfehlen wir Ihnen, Standardwerte festzulegen, um das Aussehen von Benachrichtigungen anzupassen. Sie können ein benutzerdefiniertes Standardsymbol und eine benutzerdefinierte Standardfarbe angeben, die angewendet werden, wenn keine äquivalenten Werte in der Benachrichtigungsnutzlast festgelegt sind.

Füge diese Zeilen in das application-Tag ein, um das benutzerdefinierte Standardsymbol und die benutzerdefinierte Farbe festzulegen:

<!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
     See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
     notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/colorAccent" />

Android zeigt das benutzerdefinierte Standardsymbol für

  • Alle Benachrichtigungsnachrichten, die über den Benachrichtigungs-Editor gesendet wurden.
  • Alle Benachrichtigungsnachrichten, in denen das Symbol nicht explizit in der Benachrichtigungsnutzlast festgelegt ist.

Android verwendet die benutzerdefinierte Standardfarbe für

  • Alle Benachrichtigungsnachrichten, die über den Benachrichtigungs-Editor gesendet wurden.
  • Alle Benachrichtigungsnachrichten, in denen die Farbe nicht explizit in der Benachrichtigungsnutzlast festgelegt ist.

Wenn kein benutzerdefiniertes Standardsymbol festgelegt ist und auch in der Benachrichtigungsnutzlast kein Symbol festgelegt ist, wird auf Android-Geräten das App-Symbol in weiß angezeigt.

onMessageReceived überschreiben

Wenn du die Methode FirebaseMessagingService.onMessageReceived überschreibst, kannst du Aktionen basierend auf dem empfangenen RemoteMessage-Objekt ausführen und die Nachrichtendaten abrufen:

Kotlin+KTX

override fun onMessageReceived(remoteMessage: RemoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: ${remoteMessage.from}")

    // Check if message contains a data payload.
    if (remoteMessage.data.isNotEmpty()) {
        Log.d(TAG, "Message data payload: ${remoteMessage.data}")

        // Check if data needs to be processed by long running job
        if (needsToBeScheduled()) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            scheduleJob()
        } else {
            // Handle message within 10 seconds
            handleNow()
        }
    }

    // Check if message contains a notification payload.
    remoteMessage.notification?.let {
        Log.d(TAG, "Message Notification Body: ${it.body}")
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

Java

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());

        if (/* Check if data needs to be processed by long running job */ true) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            scheduleJob();
        } else {
            // Handle message within 10 seconds
            handleNow();
        }

    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

onDeletedMessages überschreiben

In einigen Fällen wird eine Nachricht von FCM möglicherweise nicht zugestellt. Das passiert, wenn zum Zeitpunkt der Verbindung zu viele Nachrichten (mehr als 100) für Ihre App auf einem bestimmten Gerät ausstehen oder wenn sich das Gerät seit mehr als einem Monat nicht mit FCM verbunden hat. In diesen Fällen erhalten Sie möglicherweise einen Callback an FirebaseMessagingService.onDeletedMessages(). Wenn die App-Instanz diesen Callback erhält, sollte eine vollständige Synchronisierung mit Ihrem App-Server erfolgen. Wenn du auf diesem Gerät in den letzten vier Wochen keine Nachricht an die App gesendet hast, ruft FCM onDeletedMessages() nicht auf.

Benachrichtigungen in einer App im Hintergrund verarbeiten

Wenn sich Ihre App im Hintergrund befindet, leitet Android Benachrichtigungsnachrichten an die Taskleiste weiter. Wenn ein Nutzer auf die Benachrichtigung tippt, öffnet sich standardmäßig der App Launcher.

Dazu gehören Nachrichten, die sowohl Benachrichtigungs- als auch Datennutzlast enthalten, sowie alle Nachrichten, die über die Benachrichtigungskonsole gesendet wurden. In diesen Fällen wird die Benachrichtigung an das Info-Center des Geräts gesendet und die Datennutzlast wird in den Extras der Intent-Aktivität Ihres Launchers gesendet.

Informationen zur Zustellung von Nachrichten an Ihre App finden Sie im FCMBerichtsdashboard. Dort werden die Anzahl der auf Apple- und Android-Geräten gesendeten und geöffneten Nachrichten sowie Daten zu „Impressionen“ (von Nutzern gesehene Benachrichtigungen) für Android-Apps erfasst.

Sendeanfragen erstellen

Nachdem Sie ein Thema erstellt haben, indem Sie Client-App-Instanzen entweder clientseitig für das Thema abonniert oder die Server API verwendet haben, können Sie Nachrichten an das Thema senden. Wenn Sie zum ersten Mal Sendeanfragen für FCM erstellen, finden Sie im Leitfaden zu Ihrer Serverumgebung und FCM wichtige Hintergrundinformationen und Einrichtungsanleitungen.

Geben Sie in Ihrer Versandlogik im Backend den gewünschten Themennamen wie unten gezeigt an:

Node.js

// The topic name can be optionally prefixed with "/topics/".
const topic = 'highScores';

const message = {
  data: {
    score: '850',
    time: '2:45'
  },
  topic: topic
};

// Send a message to devices subscribed to the provided topic.
getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

Java

// The topic name can be optionally prefixed with "/topics/".
String topic = "highScores";

// See documentation on defining a message payload.
Message message = Message.builder()
    .putData("score", "850")
    .putData("time", "2:45")
    .setTopic(topic)
    .build();

// Send a message to the devices subscribed to the provided topic.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);

Python

# The topic name can be optionally prefixed with "/topics/".
topic = 'highScores'

# See documentation on defining a message payload.
message = messaging.Message(
    data={
        'score': '850',
        'time': '2:45',
    },
    topic=topic,
)

# Send a message to the devices subscribed to the provided topic.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)

Go

// The topic name can be optionally prefixed with "/topics/".
topic := "highScores"

// See documentation on defining a message payload.
message := &messaging.Message{
	Data: map[string]string{
		"score": "850",
		"time":  "2:45",
	},
	Topic: topic,
}

// Send a message to the devices subscribed to the provided topic.
response, err := client.Send(ctx, message)
if err != nil {
	log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)

C#

// The topic name can be optionally prefixed with "/topics/".
var topic = "highScores";

// See documentation on defining a message payload.
var message = new Message()
{
    Data = new Dictionary<string, string>()
    {
        { "score", "850" },
        { "time", "2:45" },
    },
    Topic = topic,
};

// Send a message to the devices subscribed to the provided topic.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);

REST

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
  "message":{
    "topic" : "foo-bar",
    "notification" : {
      "body" : "This is a Firebase Cloud Messaging Topic Message!",
      "title" : "FCM Message"
      }
   }
}

cURL-Befehl:

curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
  "message": {
    "topic" : "foo-bar",
    "notification": {
      "body": "This is a Firebase Cloud Messaging Topic Message!",
      "title": "FCM Message"
    }
  }
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Wenn Sie eine Nachricht an eine Kombination von Themen senden möchten, geben Sie eine Bedingung an. Das ist ein boolescher Ausdruck, der die Zielthemen angibt. Mit der folgenden Bedingung werden beispielsweise Nachrichten an Geräte gesendet, die TopicA und entweder TopicB oder TopicC abonniert haben:

"'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"

Bei FCM werden zuerst alle Bedingungen in Klammern und dann der Ausdruck von links nach rechts ausgewertet. Im obigen Ausdruck erhält ein Nutzer, der ein einzelnes Thema abonniert hat, die Nachricht nicht. Ebenso erhält ein Nutzer, der TopicA nicht abonniert, die Nachricht nicht. In folgenden Fällen erhalten Sie sie:

  • TopicA und TopicB
  • TopicA und TopicC

Sie können bis zu fünf Themen in den bedingten Ausdruck aufnehmen.

So senden Sie eine Anfrage an eine Bedingung:

Node.js

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
const condition = '\'stock-GOOG\' in topics || \'industry-tech\' in topics';

// See documentation on defining a message payload.
const message = {
  notification: {
    title: '$FooCorp up 1.43% on the day',
    body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
  },
  condition: condition
};

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

Java

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
String condition = "'stock-GOOG' in topics || 'industry-tech' in topics";

// See documentation on defining a message payload.
Message message = Message.builder()
    .setNotification(Notification.builder()
        .setTitle("$GOOG up 1.43% on the day")
        .setBody("$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.")
        .build())
    .setCondition(condition)
    .build();

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);

Python

# Define a condition which will send to devices which are subscribed
# to either the Google stock or the tech industry topics.
condition = "'stock-GOOG' in topics || 'industry-tech' in topics"

# See documentation on defining a message payload.
message = messaging.Message(
    notification=messaging.Notification(
        title='$GOOG up 1.43% on the day',
        body='$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.',
    ),
    condition=condition,
)

# Send a message to devices subscribed to the combination of topics
# specified by the provided condition.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)

Go

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
condition := "'stock-GOOG' in topics || 'industry-tech' in topics"

// See documentation on defining a message payload.
message := &messaging.Message{
	Data: map[string]string{
		"score": "850",
		"time":  "2:45",
	},
	Condition: condition,
}

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
response, err := client.Send(ctx, message)
if err != nil {
	log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)

C#

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
var condition = "'stock-GOOG' in topics || 'industry-tech' in topics";

// See documentation on defining a message payload.
var message = new Message()
{
    Notification = new Notification()
    {
        Title = "$GOOG up 1.43% on the day",
        Body = "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.",
    },
    Condition = condition,
};

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);

REST

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
   "message":{
    "condition": "'dogs' in topics || 'cats' in topics",
    "notification" : {
      "body" : "This is a Firebase Cloud Messaging Topic Message!",
      "title" : "FCM Message",
    }
  }
}

cURL-Befehl:

curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
  "notification": {
    "title": "FCM Message",
    "body": "This is a Firebase Cloud Messaging Topic Message!",
  },
  "condition": "'dogs' in topics || 'cats' in topics"
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Nächste Schritte