Birden fazla cihaza mesaj gönderin

Bir mesajı birden fazla cihaza hedeflemek için Konu mesajlaşmayı kullanın. Bu özellik, belirli bir konuyu seçen birden fazla cihaza mesaj göndermenize olanak tanır.

Bu eğitim, FCM için Admin SDK veya REST API'yi kullanarak uygulama sunucunuzdan konu mesajları göndermeye ve bunları bir android uygulamasında alıp işlemeye odaklanır. Hem arka planda hem de ön planda olan uygulamalar için mesaj işlemeyi ele alacağız. Bunu başarmak için kurulumdan doğrulamaya kadar tüm adımlar ele alınmaktadır.

SDK'yı kurma

Bu bölüm, FCM için bir Android istemci uygulaması kurduysanız veya İlk Mesajınızı Gönderme adımlarını uyguladıysanız halihazırda tamamladığınız adımları kapsayabilir.

Sen başlamadan önce

  • Android Studio'yu yükleyin veya en son sürümüne güncelleyin.

  • Projenizin şu gereksinimleri karşıladığından emin olun:

    • API düzeyi 19 (KitKat) veya üstünü hedefler
    • Android 4.4 veya üstünü kullanır
    • Aşağıdaki sürüm gereksinimlerini karşılamayı içeren Jetpack (AndroidX) kullanır:
      • com.android.tools.build:gradle v7.3.0 veya üzeri
      • compileSdkVersion 28 veya üzeri
  • Uygulamanızı çalıştırmak için fiziksel bir cihaz kurun veya bir emülatör kullanın.
    Google Play hizmetlerine bağımlı olan Firebase SDK'larının, cihazda veya emülatörde Google Play hizmetlerinin yüklü olmasını gerektirdiğini unutmayın.

  • Google hesabınızı kullanarak Firebase'de oturum açın .

Henüz bir Android projeniz yoksa ve yalnızca bir Firebase ürününü denemek istiyorsanız hızlı başlangıç ​​örneklerimizden birini indirebilirsiniz.

Firebase projesi oluşturma

Firebase'i Android uygulamanıza ekleyebilmeniz için öncelikle Android uygulamanıza bağlanacak bir Firebase projesi oluşturmanız gerekir. Firebase projeleri hakkında daha fazla bilgi edinmek için Firebase Projelerini Anlayın sayfasını ziyaret edin.

Uygulamanızı Firebase'e kaydedin

Firebase'i Android uygulamanızda kullanmak için uygulamanızı Firebase projenize kaydetmeniz gerekir. Uygulamanızı kaydetmeye genellikle uygulamanızı projenize "eklemek" denir.

  1. Firebase konsoluna gidin.

  2. Kurulum iş akışını başlatmak için projeye genel bakış sayfasının ortasındaki Android simgesine ( ) veya Uygulama ekle öğesine tıklayın.

  3. Android paket adı alanına uygulamanızın paket adını girin.

  4. (İsteğe bağlı) Diğer uygulama bilgilerini girin: Uygulama takma adı ve Hata Ayıklama imzalama sertifikası SHA-1 .

  5. Uygulamayı kaydet'i tıklayın.

Firebase yapılandırma dosyası ekleyin

  1. Firebase Android yapılandırma dosyasını ( google-services.json ) indirin ve ardından uygulamanıza ekleyin:

    1. Firebase Android yapılandırma dosyanızı edinmek için Google-services.json'u İndir'i tıklayın.

    2. Yapılandırma dosyanızı uygulamanızın modül (uygulama düzeyi) kök dizinine taşıyın.

  2. google-services.json yapılandırma dosyanızdaki değerlerin Firebase SDK'ları tarafından erişilebilir olmasını sağlamak için Google hizmetleri Gradle eklentisine ( google-services ) ihtiyacınız vardır.

    1. Kök düzeyindeki (proje düzeyi) Gradle dosyanıza ( <project>/build.gradle.kts veya <project>/build.gradle ), Google hizmetleri eklentisini bağımlılık olarak ekleyin:

      Kotlin

      plugins {
        id("com.android.application") version "7.3.0" apply false
        // ...
      
        // Add the dependency for the Google services Gradle plugin
        id("com.google.gms.google-services") version "4.4.1" apply false
      }
      

      Groovy

      plugins {
        id 'com.android.application' version '7.3.0' apply false
        // ...
      
        // Add the dependency for the Google services Gradle plugin
        id 'com.google.gms.google-services' version '4.4.1' apply false
      }
      
    2. Modülünüzün (uygulama düzeyi) Gradle dosyasına (genellikle <project>/<app-module>/build.gradle.kts veya <project>/<app-module>/build.gradle ), Google hizmetleri eklentisini ekleyin:

      Kotlin

      plugins {
        id("com.android.application")
      
        // Add the Google services Gradle plugin
        id("com.google.gms.google-services")
        // ...
      }
      

      Groovy

      plugins {
        id 'com.android.application'
      
        // Add the Google services Gradle plugin
        id 'com.google.gms.google-services'
        // ...
      }
      

Firebase SDK'larını uygulamanıza ekleyin

  1. Modül (uygulama düzeyi) Gradle dosyanıza (genellikle <project>/<app-module>/build.gradle.kts veya <project>/<app-module>/build.gradle ), Firebase Cloud bağımlılığını ekleyin Android için mesajlaşma kütüphanesi. Kitaplık sürümlerini kontrol etmek için Firebase Android BoM'yi kullanmanızı öneririz.

    Firebase Cloud Messaging ile en iyi deneyimi elde etmek için Firebase projenizde Google Analytics'i etkinleştirmenizi ve Google Analytics için Firebase SDK'sını uygulamanıza eklemenizi öneririz.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:32.7.4"))
    
        // Add 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")
    }
    

    Firebase Android BoM'yi kullandığınızda uygulamanız her zaman Firebase Android kitaplıklarının uyumlu sürümlerini kullanır.

    (Alternatif) BoM'yi kullanmadan Firebase kitaplığı bağımlılıklarını ekleyin

    Firebase BoM'yi kullanmamayı tercih ederseniz her Firebase kitaplığı sürümünü bağımlılık satırında belirtmeniz gerekir.

    Uygulamanızda birden fazla Firebase kitaplığı kullanıyorsanız kitaplık sürümlerini yönetmek için tüm sürümlerin uyumlu olmasını sağlayan BoM'yi kullanmanızı önemle tavsiye ettiğimizi unutmayın.

    dependencies {
        // Add 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:23.4.1")
        implementation("com.google.firebase:firebase-analytics:21.5.1")
    }
    
    Kotlin'e özgü bir kütüphane modülü mü arıyorsunuz? Ekim 2023'ten itibaren (Firebase BoM 32.5.0) hem Kotlin hem de Java geliştiricileri ana kütüphane modülüne güvenebilecekler (ayrıntılar için bu girişimle ilgili SSS'ye bakın).

  2. Android projenizi Gradle dosyalarıyla senkronize edin.

İstemci uygulamasını bir konuya abone olma

İstemci uygulamaları mevcut herhangi bir konuya abone olabilir veya yeni bir konu oluşturabilir. Bir istemci uygulaması yeni bir konu adına (Firebase projeniz için halihazırda mevcut olmayan bir konu) abone olduğunda, FCM'de bu adda yeni bir konu oluşturulur ve herhangi bir istemci daha sonra bu konuya abone olabilir.

Bir konuya abone olmak için istemci uygulaması, FCM konu adıyla Firebase Cloud Messaging subscribeToTopic() çağırır. Bu yöntem, aboneliğin başarılı olup olmadığını belirlemek için tamamlama dinleyicisi tarafından kullanılabilecek bir Task döndürür:

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();
            }
        });

Abonelikten çıkmak için istemci uygulaması konu adıyla Firebase Cloud Messaging unsubscribeFromTopic() çağırır.

Konu mesajlarını alma ve yönetme

FCM, konu mesajlarını diğer alt mesajlarla aynı şekilde iletir.

Mesaj almak için FirebaseMessagingService kapsamını genişleten bir hizmet kullanın. Hizmetiniz onMessageReceived ve onDeletedMessages geri aramalarını geçersiz kılmalıdır.

Bir iletinin işlenmesi için zaman penceresi, işletim sistemi gecikmeleri, uygulama başlatma süresi, ana iş parçacığının diğer işlemler tarafından engellenmesi veya önceki onMessageReceived çağrılarının çok uzun sürmesi dahil olmak üzere, onMessageReceived çağrılmadan önce oluşan gecikmelere bağlı olarak 20 saniyeden kısa olabilir. Bu sürenin sonunda, Android'in işlem sonlandırması veya Android O'nun arka planda yürütme sınırları gibi çeşitli işletim sistemi davranışları, çalışmanızı tamamlama yeteneğinizi etkileyebilir.

onMessageReceived , aşağıdaki istisnalar dışında çoğu mesaj türü için sağlanır:

  • Uygulamanız arka planda olduğunda gönderilen bildirim mesajları . Bu durumda bildirim cihazın sistem tepsisine iletilir. Kullanıcının bir bildirime dokunması varsayılan olarak uygulama başlatıcıyı açar.

  • Arka planda alındığında hem bildirim hem de veri yükü içeren mesajlar . Bu durumda, bildirim cihazın sistem tepsisine iletilir ve veri yükü, başlatıcı Etkinliğinizin amacının ekstralarında iletilir.

Özetle:

Uygulama durumu Bildiri Veri İkisi birden
Ön plan onMessageReceived onMessageReceived onMessageReceived
Arka plan Sistem tepsisi onMessageReceived Bildirim: sistem tepsisi
Veri: amacın ekstralarında.
Mesaj türleri hakkında daha fazla bilgi için bkz. Bildirimler ve veri mesajları .

Uygulama bildirimini düzenleyin

FirebaseMessagingService kullanmak için uygulama bildiriminize aşağıdakileri eklemeniz gerekir:

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

Ayrıca bildirimlerin görünümünü özelleştirmek için varsayılan değerleri ayarlamanız önerilir. Bildirim verisinde eşdeğer değerler ayarlanmadığında uygulanacak özel bir varsayılan simge ve özel bir varsayılan renk belirtebilirsiniz.

Özel varsayılan simgeyi ve özel rengi ayarlamak için application etiketinin içine şu satırları ekleyin:

<!-- 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, aşağıdakiler için özel varsayılan simgeyi görüntüler:

  • Bildirimler oluşturucusundan gönderilen tüm bildirim iletileri.
  • Bildirim yükündeki simgeyi açıkça ayarlamayan herhangi bir bildirim mesajı.

Android, aşağıdakiler için özel varsayılan rengi kullanır:

  • Bildirimler oluşturucusundan gönderilen tüm bildirim iletileri.
  • Bildirim yükünün rengini açıkça ayarlamayan herhangi bir bildirim mesajı.

Özel bir varsayılan simge ayarlanmamışsa ve bildirim yükünde hiçbir simge ayarlanmamışsa Android, uygulama simgesini beyaz renkte görüntüler.

Alınan onMessageReceived Geçersiz Kıl

FirebaseMessagingService.onMessageReceived yöntemini geçersiz kılarak, alınan RemoteMessage nesnesine dayalı eylemler gerçekleştirebilir ve mesaj verilerini alabilirsiniz:

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 Geçersiz Kıl

Bazı durumlarda FCM mesaj iletmeyebilir. Bu durum, bağlandığı sırada belirli bir cihazda uygulamanız için bekleyen çok fazla mesaj (>100) olduğunda veya cihaz bir aydan uzun bir süredir FCM'ye bağlanmadığında ortaya çıkar. Bu durumlarda FirebaseMessagingService.onDeletedMessages() 'a bir geri arama alabilirsiniz. Uygulama örneği bu geri aramayı aldığında, uygulama sunucunuzla tam senkronizasyon gerçekleştirmelidir. Son 4 hafta içinde söz konusu cihazdaki uygulamaya mesaj göndermediyseniz FCM, onDeletedMessages() çağırmaz.

Arka plandaki bir uygulamada bildirim mesajlarını işleme

Uygulamanız arka planda olduğunda Android, bildirim mesajlarını sistem tepsisine yönlendirir. Kullanıcının bildirime dokunması varsayılan olarak uygulama başlatıcıyı açar.

Bu, hem bildirim hem de veri yükünü içeren mesajları (ve Bildirimler konsolundan gönderilen tüm mesajları) içerir. Bu durumlarda, bildirim cihazın sistem tepsisine iletilir ve veri yükü, başlatıcı Etkinliğinizin amacının ekstralarında iletilir.

Uygulamanıza mesaj teslimine ilişkin bilgi edinmek için, Apple ve Android cihazlarda gönderilen ve açılan mesajların sayısını ve ayrıca Android uygulamalarına ilişkin "gösterimler" (kullanıcılar tarafından görülen bildirimler) verilerini kaydeden FCM raporlama kontrol paneline bakın.

Gönderme istekleri oluşturma

İstemci uygulaması örneklerini istemci tarafındaki konuya abone olarak veya sunucu API'si aracılığıyla bir konu oluşturduktan sonra konuya ileti gönderebilirsiniz. FCM için ilk kez gönderme istekleri oluşturuyorsanız, önemli arka plan ve kurulum bilgileri için sunucu ortamınıza ve FCM kılavuzuna bakın.

Arka uçtaki gönderme mantığınızda, istediğiniz konu adını gösterildiği gibi belirtin:

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)

Gitmek

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

DİNLENMEK

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 komutu:

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

Konuların bir kombinasyonuna mesaj göndermek için, hedef konuları belirten bir boolean ifadesi olan bir koşul belirtin. Örneğin, aşağıdaki koşul TopicA ve TopicB veya TopicC abone olan cihazlara mesaj gönderecektir:

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

FCM önce parantez içindeki koşulları değerlendirir, ardından ifadeyi soldan sağa doğru değerlendirir. Yukarıdaki ifadede herhangi bir konuya abone olan kullanıcı mesajı almıyor. Aynı şekilde TopicA abone olmayan bir kullanıcı da mesajı alamamaktadır. Bu kombinasyonlar bunu alır:

  • TopicA ve TopicB
  • TopicA ve TopicC

Koşullu ifadenize en fazla beş konu ekleyebilirsiniz.

Bir koşula göndermek için:

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)

Gitmek

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

DİNLENMEK

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 komutu:

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

Sonraki adımlar