Birden çok cihaza mesaj gönderme

Bir mesajı birden çok cihaza hedeflemek için şunu kullanın: Konu mesajları. Bu özelliği kullanarak Belirli bir konuda kaydolan birden çok cihaza mesaj gönderebilirsiniz.

Bu eğitim, Admin SDK veya FCM için REST API, ve ele alma sürecini Android uygulamasında kullanabilirsiniz. Hem arka plandaki hem de e-postalara yönelik ön plandaki uygulamalar. Kurulumdan bu amaca yönelik tüm adımlar ele alınmıştır. doğrulama.

SDK'yı ayarlama

Bu bölümde, Android istemci uygulaması yüklemiş olmanız gerekir yoksa bu sürecin tamamlanması için İlk Mesajınızı Gönderin.

Başlamadan önce

  • Android Studio'yu yükleme veya güncelleme sürümüne geri yükleyebilirsiniz.

  • Projenizin bu gereksinimleri karşıladığından emin olun (bazı ürünlerin daha katı şartlara sahip olabilir):

    • API düzeyi 19'u hedefler (KitKat) veya üzeri
    • Android 4.4 veya sonraki bir sürümü kullanmalıdır
    • Kullanım Jetpack (AndroidX), Aşağıdaki sürümle ilgili koşullar karşılanmalıdır:
      • com.android.tools.build:gradle 7.3.0 veya sonraki sürümler
      • compileSdkVersion 28 yaş veya üzeri
  • Fiziksel bir cihaz ayarlayın veya emülatörü kullanarak uygulamanızı çalıştırın.
    Google Play'e bağımlılığı olan Firebase SDK'larının hizmetleri için cihaz veya emülatöründe Google Play Hizmetleri yüklü olmalıdır.

  • Google Hesabınızla Firebase'de oturum açın hesap.

Henüz bir Android projeniz yoksa ve bir Firebase'i denemek istiyorsanız hızlı başlangıç örneklerimizden birini indirebilirsiniz.

Firebase projesi oluşturma

Firebase'i Android uygulamanıza eklemeden önce Firebase oluşturmanız gerekir projesini anlatacağım. Ziyaret edin: Şu konular hakkında daha fazla bilgi edinmek için Firebase Projelerini Anlama: Firebase projeleri.

Uygulamanızı Firebase'e kaydedin

Firebase'i Android uygulamanızda kullanmak için, uygulamanızı Firebase projesi. Uygulamanızı kaydetme işlemi genellikle "ekleme" olarak adlandırılır uygulamanızı belirler.

  1. Firebase konsoluna gidin.

  2. Projeye genel bakış sayfasının ortasındaki Android simgesini tıklayın () veya kurulum iş akışını başlatmak için Uygulama ekle'yi tıklayın.

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

    ziyaret edin.
  4. (İsteğe bağlı) Diğer uygulama bilgilerini girin: Uygulama takma adı ve SHA-1 imza sertifikası hatalarını ayıkla.

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

Firebase yapılandırma dosyası ekleme

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

    1. Firebase Android sürümünüzü edinmek için google-services.json'u indir'i tıklayın. yapılandırma dosyası.

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

  2. google-services.json yapılandırma dosyanızdaki değerleri erişilebilir hale getirmek için Firebase SDK'larını kullanıyorsanız Google hizmetleri Gradle eklentisi (google-services).

    1. Kök düzeyindeki (proje düzeyinde) Gradle dosyanızda (<project>/build.gradle.kts veya <project>/build.gradle), Bağımlılık olarak Google hizmetleri eklentisi:

      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.2" 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.2' apply false
      }
      
    2. Modülünüz (uygulama düzeyinde) Gradle dosyanızda (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üzeyinde) Gradle dosyanızda (genellikle <project>/<app-module>/build.gradle.kts veya <project>/<app-module>/build.gradle), ve Android için Firebase Cloud Messaging kitaplığına bağımlılığı ekleyin. Şunu kullanmanızı öneririz: Firebase Android BoM Kitaplık'ta sürüm oluşturmayı kontrol etmek için

    Firebase Cloud Messaging ile optimum bir deneyim için şunları yapmanızı öneririz: Google Analytics'i etkinleştirme Firebase projenize ekleyin ve uygulamanıza Google Analytics için Firebase SDK'sını ekleyin.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.1.2"))
    
        // 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'u kullanarak, Uygulamanız her zaman Firebase Android kitaplıklarının uyumlu sürümlerini kullanacaktır.

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

    Firebase BoM'yi kullanmamayı tercih ederseniz her Firebase kitaplığı sürümünü belirtmeniz gerekir değerini alır.

    Uygulamanızda birden çok Firebase kitaplığı kullanıyorsanız, kitaplık sürümlerini yönetmek için BoM kullanmanızı öneririz. Böylece, uyumlu olur.

    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:24.0.0")
        implementation("com.google.firebase:firebase-analytics:22.0.2")
    }
    
    .
    'nı inceleyin. Kotlin'e özel bir kitaplık modülü mü arıyorsunuz? Başlamak için kalan süre: Ekim 2023 (Firebase BoM 32.5.0), hem Kotlin hem de Java geliştiricileri (ayrıntılar için bkz. bu girişimle ilgili SSS).

  2. Android projenizi Gradle dosyalarıyla senkronize edin.

İstemci uygulamasının bir konuya abone olmasını sağlama

İstemci uygulamaları mevcut herhangi bir konuya abone olabilir veya yeni bir konu oluşturabilir konu. Bir istemci uygulaması yeni bir konu adına abone olduğunda ( Firebase projeniz için zaten mevcut değilse) bu ada sahip yeni bir konu oluşturabilirsiniz. Böylece tüm müşteriler daha sonra bu hizmete abone olabilir.

İstemci uygulaması, bir konuya abone olmak için Firebase Cloud Messaging'i çağırır subscribeToTopic() (FCM konu adıyla değiştirin). Bu yöntem bir tamamlama dinleyicisi tarafından kullanılabilir;Task abonelik başarılı oldu:

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

İstemci uygulaması, e-posta listesinden çıkmak için Firebase Cloud Messaging'e unsubscribeFromTopic() telefon eder. konu adını yazın.

Konu mesajlarını alma ve işleme

FCM, konu mesajlarını diğer aşağı akışla aynı şekilde sunar mesaj.

Mesajları almak için FirebaseMessagingService değerleridir. Hizmetiniz onMessageReceived ve onDeletedMessages koşullarını geçersiz kılmalıdır daha fazla bilgi edindiniz.

Bir iletinin işlenmesi için gereken süre, gecikmelere bağlı olarak 20 saniyeden kısa olabilir. İşletim sistemi gecikmeleri, uygulama başlatma süresi,onMessageReceived diğer işlemler tarafından engellenen ana iş parçacığı veya önceki onMessageReceived çok uzun sürüyor. Sonrasında, Android'in işlem öldürme veya Android O'nun arka planda yürütme sınırları işlerinizi tamamlamanızı engelleyebilir.

onMessageReceived, aşağıdakiler dahil çoğu mesaj türü için sağlanır: istisnalar:

  • Uygulamanız arka plandayken teslim edilecek bildirim mesajları Burada durumda, bildirim cihazın sistem tepsisine iletilir. Kullanıcı bir bildirime dokunduğunda 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ü ekstra başlatıcı Etkinliğinizin amacı.

Özet olarak:

Uygulama durumu Bildirim Veriler İkisi de
Ö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ı için de geçerlidir.

Uygulama manifestini düzenleyin

FirebaseMessagingService uygulamasını kullanmak için aşağıdakileri sayfanıza eklemeniz gerekir: uygulama manifesti:

<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ğerler ayarlamanız önerilir. Siz özel bir varsayılan simge ve her cihazda uygulanan özel bir varsayılan renk eşdeğer değerler bildirim yükünde ayarlanmaz.

Bu satırları, application etiketini kullanarak özel varsayılan simgeyi ve özel rengi ayarlayın:

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

Android,

Özel bir varsayılan simge ayarlanmazsa ve bildirim yükünde herhangi bir simge ayarlanmamışsa Android'de uygulama simgesi beyaz renkte görüntülenir.

onMessageReceived öğesini geçersiz kıl

FirebaseMessagingService.onMessageReceived yöntemini geçersiz kılarak alınan iletişim bilgilerine göre RemoteMessage nesnesini tanımlayın ve mesaj verilerini alın:

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 öğesini geçersiz kıl

Bazı durumlarda FCM mesaj teslim etmeyebilir. Bu durum, aynı anda çok fazla mesaj (>100) için beklemede sırasında veya bağlı değilken belirli bir cihazda uygulamanızı FCM'ye bir aydan uzun bir süre sonra. Böyle durumlarda FirebaseMessagingService.onDeletedMessages() numaralı telefonu arayabilirsiniz Uygulama örneği bu geri çağırmayı aldığında uygulama sunucunuzla tam senkronizasyon gerçekleştirmesi gerekir. Uygulamaya bu konuda mesaj göndermediyseniz cihazı son 4 hafta içinde görürseniz FCM, onDeletedMessages() numaralı telefonu aramayacaktır.

Bildirim mesajlarını arka plandaki bir uygulamada işleme

Android, uygulamanız arka planda çalışırken bildirim mesajlarını şuraya yönlendirir: sistem tepsisini açın. Kullanıcı bildirime dokunduğunda uygulama başlatıcıyı açan kişi: varsayılandır.

Buna, hem bildirim hem de veriler içeren mesajlar dahildir yük (ve Notifications konsolundan gönderilen tüm mesajlar). Bu durumlarda, bildirim cihazın veri yükü amaçlanan ekstra şeklinde teslim edilir başlatıcı Etkinliğiniz.

Uygulamanıza mesaj teslimiyle ilgili analizler için bkz. FCM raporlama kontrol paneli, Apple ve Android cihazlarda gönderilen ve açılan iletilerin sayısı "gösterimler" için veriler (kullanıcılar tarafından görülen bildirimler).

Gönderme istekleri oluşturma

Bir konu oluşturduktan sonra, istemci uygulaması örneklerini müşteri tarafında veya müşteri tarafında sunucu API'sine sahipseniz, konu. FCM için gönderme isteklerini ilk kez oluşturuyorsanız kılavuzu inceleyin sunucu ortamınıza ve FCM'ye önemli arka plan ve kurulum bilgilerini sağlar.

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

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

Konu kombinasyonuna ileti göndermek için bir koşul belirtin. Bu, konuları ele alalım. Örneğin, aşağıdaki koşul iletileri TopicA ve TopicB ya da TopicC aboneliklerine abone olan cihazlar:

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

FCM önce parantez içindeki koşulları değerlendirir, ardından tıklayın. Yukarıdaki ifadede, bir kullanıcı mesajı almamasını sağlayabilirsiniz. Benzer şekilde, TopicA için abone ol düğmesi, mesajı almıyor. Bu kombinasyonlar alın:

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

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

  • Sunucunuzu kullanarak istemci uygulaması örneklerini konulara abone olabilir ve diğer yönetim görevlerini tamamlamanıza yardımcı olur. Görüntüleyin Sunucudaki konu aboneliklerini yönetin.