Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

Wysyłaj wiadomości do wielu urządzeń

Firebase Cloud Messaging udostępnia dwa sposoby kierowania wiadomości na wiele urządzeń:

  • Wiadomości tematyczne , które umożliwiają wysyłanie wiadomości do wielu urządzeń, na których włączono określony temat.
  • Wiadomości grupowe urządzeń , które umożliwiają wysyłanie wiadomości do wielu urządzeń należących do zdefiniowanej przez Ciebie grupy.

Ten samouczek koncentruje się na wysyłaniu komunikatów tematów z serwera aplikacji przy użyciu pakietu Admin SDK lub interfejsu API REST dla FCM oraz odbieraniu i obsłudze ich w aplikacji dla systemu Android. Omówimy obsługę wiadomości w aplikacjach działających w tle i na pierwszym planie. Wszystkie kroki, aby to osiągnąć, są omówione, od konfiguracji po weryfikację.

Skonfiguruj pakiet SDK

Ta sekcja może obejmować kroki, które zostały już wykonane, jeśli masz skonfigurowaną aplikację kliencką na Androida dla FCM lub wykonałeś czynności związane z wysyłaniem pierwszej wiadomości .

Zanim zaczniesz

  • Zainstaluj lub zaktualizuj Android Studio do najnowszej wersji.

  • Upewnij się, że Twój projekt spełnia te wymagania:

    • Targets API level 16 (Jelly Bean) lub nowszy
    • Używa Gradle 4.1 lub nowszego
    • Używa Jetpack (AndroidX) , który obejmuje spełnienie następujących wymagań wersji:
      • com.android.tools.build:gradle V3.2.1 lub później
      • compileSdkVersion 28 lub nowszą
  • Skonfiguruj urządzenie fizyczne lub użyj emulatora, aby uruchomić aplikację.
    Pamiętaj, że pakiety SDK Firebase zależne od usług Google Play wymagają, aby na urządzeniu lub emulatorze były zainstalowane usługi Google Play.

  • Zaloguj się do Firebase przy użyciu swojego konta Google.

Jeśli nie masz jeszcze projektu na Androida, a chcesz tylko wypróbować produkt Firebase, możesz pobrać jeden z naszych krótkich przykładów .

Utwórz projekt Firebase

Zanim dodasz Firebase do swojej aplikacji na Androida, musisz utworzyć projekt Firebase, aby połączyć się z aplikacją na Androida. Odwiedź Zrozumienie projektów Firebase, aby dowiedzieć się więcej o projektach Firebase.

Zarejestruj swoją aplikację w Firebase

Aby korzystać z Firebase w aplikacji na Androida, musisz zarejestrować swoją aplikację w projekcie Firebase. Rejestracja aplikacji jest często nazywana „dodawaniem” aplikacji do projektu.

  1. Przejdź do konsoli Firebase .

  2. Na środku strony przeglądu projektu kliknij ikonę Androida ( ) lub Dodaj aplikację, aby uruchomić przepływ pracy instalacji.

  3. Wpisz nazwę pakietu swojej aplikacji w polu Nazwa pakietu Androida .

  4. (Opcjonalnie) Podaj inne informacje o aplikacji: pseudonim aplikacji i certyfikat podpisywania debugowania SHA-1 .

  5. Kliknij Zarejestruj aplikację .

Dodaj plik konfiguracyjny Firebase

  1. Dodaj plik konfiguracyjny Firebase Android do swojej aplikacji:

    1. Kliknij Pobierz google-services.json, aby uzyskać plik konfiguracyjny Firebase Android ( google-services.json ).

    2. Przenieś plik konfiguracyjny do katalogu modułu (na poziomie aplikacji) swojej aplikacji.

  2. Aby włączyć produkty Firebase w swojej aplikacji, dodaj wtyczkę google-services do swoich plików Gradle.

    1. W pliku Gradle na poziomie głównym (na poziomie projektu) ( build.gradle ) dodaj reguły, aby uwzględnić wtyczkę Google Services Gradle. Sprawdź również, czy masz repozytorium Maven firmy Google.

      buildscript {
      
        repositories {
          // Check that you have the following line (if not, add it):
          google()  // Google's Maven repository
        }
      
        dependencies {
          // ...
      
          // Add the following line:
          classpath 'com.google.gms:google-services:4.3.8'  // Google Services plugin
        }
      }
      
      allprojects {
        // ...
      
        repositories {
          // Check that you have the following line (if not, add it):
          google()  // Google's Maven repository
          // ...
        }
      }
      
    2. W pliku Gradle modułu (na poziomie aplikacji) (zwykle app/build.gradle ) zastosuj wtyczkę Google Services Gradle:

      apply plugin: 'com.android.application'
      // Add the following line:
      apply plugin: 'com.google.gms.google-services'  // Google Services plugin
      
      android {
        // ...
      }
      

Dodaj pakiety SDK Firebase do swojej aplikacji

  1. Korzystając z modułu Firebase Android BoM , zadeklaruj zależność dla biblioteki Firebase Cloud Messaging dla systemu Android w pliku Gradle modułu (na poziomie aplikacji) (zwykle app/build.gradle ).

    Aby zapewnić optymalne działanie Firebase Cloud Messaging, zalecamy włączenie Google Analytics w projekcie Firebase i dodanie pakietu SDK Firebase dla Google Analytics do swojej aplikacji.

    Jawa

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.1.0')
    
        // Declare the dependencies for the Firebase Cloud Messaging and Analytics libraries
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-messaging'
        implementation 'com.google.firebase:firebase-analytics'
    }
    

    Korzystając z Firebase Android BoM , Twoja aplikacja będzie zawsze używać zgodnych wersji bibliotek Firebase Android.

    (Alternatywnie) Zadeklaruj zależności biblioteki Firebase bez użycia BoM

    Jeśli zdecydujesz się nie korzystać z BoM Firebase, musisz określić każdą wersję biblioteki Firebase w jej wierszu zależności.

    Pamiętaj, że jeśli korzystasz z wielu bibliotek Firebase w swojej aplikacji, zdecydowanie zalecamy używanie BoM do zarządzania wersjami bibliotek, co zapewnia zgodność wszystkich wersji.

    dependencies {
        // Declare the dependencies for the Firebase Cloud Messaging and Analytics libraries
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-messaging:22.0.0'
        implementation 'com.google.firebase:firebase-analytics:19.0.0'
    }
    

    Kotlin+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.1.0')
    
        // Declare the dependencies for the Firebase Cloud Messaging and Analytics libraries
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-messaging-ktx'
        implementation 'com.google.firebase:firebase-analytics-ktx'
    }
    

    Korzystając z Firebase Android BoM , Twoja aplikacja będzie zawsze używać zgodnych wersji bibliotek Firebase Android.

    (Alternatywnie) Zadeklaruj zależności biblioteki Firebase bez użycia BoM

    Jeśli zdecydujesz się nie korzystać z BoM Firebase, musisz określić każdą wersję biblioteki Firebase w jej wierszu zależności.

    Pamiętaj, że jeśli korzystasz z wielu bibliotek Firebase w swojej aplikacji, zdecydowanie zalecamy używanie BoM do zarządzania wersjami bibliotek, co zapewnia zgodność wszystkich wersji.

    dependencies {
        // Declare the dependencies for the Firebase Cloud Messaging and Analytics libraries
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-messaging-ktx:22.0.0'
        implementation 'com.google.firebase:firebase-analytics-ktx:19.0.0'
    }
    

  2. Zsynchronizuj swoją aplikację, aby upewnić się, że wszystkie zależności mają niezbędne wersje.

Subskrybuj aplikację kliencką do tematu

Aplikacje klienckie mogą subskrybować dowolny istniejący temat lub mogą tworzyć nowy temat. Gdy aplikacja kliencka zasubskrybuje nową nazwę tematu (taką, która jeszcze nie istnieje w Twoim projekcie Firebase), nowy temat o tej nazwie jest tworzony w FCM i każdy klient może go następnie subskrybować.

Aby zasubskrybować temat, aplikacja kliencka wywołuje subscribeToTopic() Firebase Cloud Messaging subscribeToTopic() z nazwą tematu FCM. Ta metoda zwraca Task , który może być używany przez detektor zakończenia w celu określenia, czy subskrypcja się powiodła:

Jawa

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

Kotlin+KTX

Firebase.messaging.subscribeToTopic("weather")
        .addOnCompleteListener { task ->
            var msg = getString(R.string.msg_subscribed)
            if (!task.isSuccessful) {
                msg = getString(R.string.msg_subscribe_failed)
            }
            Log.d(TAG, msg)
            Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
        }

Aby anulować subskrypcję, aplikacja kliencka wywołuje funkcję Firebase Cloud Messaging unsubscribeFromTopic() z nazwą tematu.

Odbieraj i obsługuj wiadomości tematyczne

FCM dostarcza komunikaty tematu w taki sam sposób, jak inne komunikaty podrzędne.

Aby odbierać wiadomości, użyj usługi rozszerzającej FirebaseMessagingService . Twoja usługa powinna zastąpić wywołania zwrotne onMessageReceived i onDeletedMessages . Powinien obsłużyć każdą wiadomość w ciągu 20 sekund od otrzymania (10 sekund na Androidzie Marshmallow). Okno czasowe może być krótsze w zależności od opóźnień systemu operacyjnego przed wywołaniem onMessageReceived . Po tym czasie różne zachowania systemu operacyjnego, takie jak limity wykonywania w tle Androida O, mogą zakłócać Twoją zdolność do ukończenia pracy. Aby uzyskać więcej informacji, zobacz nasz przegląd priorytetów wiadomości .

onMessageReceived jest dostępny dla większości typów wiadomości, z następującymi wyjątkami:

  • Powiadomienia dostarczane, gdy aplikacja działa w tle . W takim przypadku powiadomienie jest dostarczane do zasobnika systemowego urządzenia. Dotknięcie powiadomienia przez użytkownika domyślnie otwiera program uruchamiający aplikację.

  • Wiadomości z powiadomieniami i danymi, gdy są odbierane w tle . W takim przypadku powiadomienie jest dostarczane do zasobnika systemowego urządzenia, a ładunek danych jest dostarczany w dodatkach zgodnie z intencją działania programu uruchamiającego.

W podsumowaniu:

Stan aplikacji Powiadomienie Dane Obie
Pierwszoplanowy onMessageReceived onMessageReceived onMessageReceived
tło Taca systemowa onMessageReceived Powiadomienie: taca systemowa
Dane: w dodatkach intencji.
Aby uzyskać więcej informacji o typach wiadomości, zobacz Powiadomienia i wiadomości dotyczące danych .

Edytuj manifest aplikacji

Aby korzystać z usługi FirebaseMessagingService , musisz dodać następujące elementy w manifeście aplikacji:

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

Ponadto zaleca się ustawienie wartości domyślnych, aby dostosować wygląd powiadomień. Można określić niestandardową domyślną ikonę i niestandardowy domyślny kolor, które są stosowane, gdy w ładunku powiadomienia nie są ustawione równoważne wartości.

Dodaj te linie wewnątrz tagu application aby ustawić niestandardową domyślną ikonę i niestandardowy kolor:

<!-- 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 wyświetla niestandardową domyślną ikonę dla

  • Wszystkie powiadomienia wysłane przez kompozytora powiadomień .
  • Każda wiadomość z powiadomieniem, która nie ustawia jawnie ikony w ładunku powiadomienia.

Android używa niestandardowego domyślnego koloru dla

  • Wszystkie powiadomienia wysłane przez kompozytora powiadomień .
  • Każda wiadomość z powiadomieniem, która nie określa jawnie koloru w ładunku powiadomienia.

Jeśli nie ustawiono niestandardowej ikony domyślnej i nie ustawiono żadnej ikony w ładunku powiadomienia, system Android wyświetla ikonę aplikacji w kolorze białym.

Zastąp przy onMessageReceived

Zastępując metodę FirebaseMessagingService.onMessageReceived , możesz wykonać akcje na podstawie otrzymanego obiektu RemoteMessage i uzyskać dane wiadomości:

Jawa

@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.
}

Kotlin+KTX

045983730

Zastąp onDeletedMessages

W niektórych sytuacjach FCM może nie dostarczyć wiadomości. Dzieje się tak, gdy jest zbyt wiele wiadomości (>100) oczekujących na aplikację na określonym urządzeniu w momencie łączenia się lub jeśli urządzenie nie łączy się z FCM przez ponad miesiąc. W takich przypadkach możesz otrzymać wywołanie zwrotne do FirebaseMessagingService.onDeletedMessages() Gdy wystąpienie aplikacji odbierze to wywołanie zwrotne, powinno wykonać pełną synchronizację z serwerem aplikacji. Jeśli nie wysłałeś wiadomości do aplikacji na tym urządzeniu w ciągu ostatnich 4 tygodni, FCM nie onDeletedMessages() .

Obsługa powiadomień w aplikacji działającej w tle

Gdy Twoja aplikacja działa w tle, Android kieruje powiadomienia do zasobnika systemowego. Dotknięcie powiadomienia przez użytkownika domyślnie otwiera program uruchamiający aplikację.

Obejmuje to wiadomości zawierające zarówno powiadomienia, jak i ładunek danych (oraz wszystkie wiadomości wysyłane z konsoli powiadomień). W takich przypadkach powiadomienie jest dostarczane do zasobnika systemowego urządzenia, a ładunek danych jest dostarczany w dodatkach zgodnie z intencją Aktywności programu uruchamiającego.

Aby uzyskać wgląd w dostarczanie wiadomości do Twojej aplikacji, zapoznaj się z panelem raportowania FCM , który rejestruje liczbę wiadomości wysłanych i otwartych na urządzeniach z systemem iOS i Android wraz z danymi dotyczącymi „wyświetleń” (powiadomień widzianych przez użytkowników) dla aplikacji na Androida.

Aplikacje z ograniczonym dostępem w tle (Android P lub nowszy)

FCM może nie dostarczać wiadomości do aplikacji, które zostały ustawione w tle przez użytkownika (na przykład przez: Ustawienia -> Aplikacje i powiadomienia -> [nazwa aplikacji] -> Bateria). Gdy aplikacja zostanie usunięta z ograniczenia w tle, nowe wiadomości do aplikacji będą dostarczane tak jak poprzednio. Aby zapobiec utracie wiadomości i innym wpływom ograniczeń w tle, unikaj złych zachowań wymienionych w wysiłkach Android Vitals . Takie zachowania mogą spowodować, że urządzenie z Androidem zaleci użytkownikowi ograniczenie aplikacji w tle. Twoja aplikacja może sprawdzić, czy jest ograniczona w tle, używając: isBackgroundRestricted() .

Zbuduj wyślij żądania

Po utworzeniu tematu, subskrybując wystąpienia aplikacji klienckiej do tematu po stronie klienta lub za pośrednictwem interfejsu API serwera , możesz wysyłać komunikaty do tematu. Jeśli po raz pierwszy budujesz i wysyłasz żądania FCM, zapoznaj się z przewodnikiem po środowisku serwera i FCM, aby uzyskać ważne informacje o tle i konfiguracji.

W logice wysyłania na zapleczu określ żądaną nazwę tematu, jak pokazano:

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.
admin.messaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

Jawa

// 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);

Pyton

# 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)

Udać się

// 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)

DO#

// 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);

RESZTA

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, polecenie:

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

Aby wysłać wiadomość do kombinacji tematów, określ warunek , który jest wyrażeniem logicznym określającym tematy docelowe. Na przykład następujący warunek spowoduje wysłanie komunikatów do urządzeń zasubskrybowanych w TopicA i TopicB lub TopicC :

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

FCM najpierw ocenia wszystkie warunki w nawiasach, a następnie ocenia wyrażenie od lewej do prawej. W powyższym wyrażeniu użytkownik zasubskrybowany do dowolnego pojedynczego tematu nie otrzymuje wiadomości. Podobnie użytkownik, który nie subskrybuje TopicA , nie otrzymuje wiadomości. Te kombinacje otrzymują to:

  • TopicA i TopicB
  • TopicA i TopicC

W wyrażeniu warunkowym możesz zawrzeć do pięciu tematów.

Aby wysłać do warunku:

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.
admin.messaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

Jawa

// 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);

Pyton

# 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)

Udać się

// 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)

DO#

// 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);

RESZTA

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, polecenie:

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

Następne kroki