ข้อความตามหัวข้อใน Android

การรับส่งข้อความหัวข้อ FCM ช่วยให้คุณสามารถส่งข้อความได้ ทั้งนี้ขึ้นอยู่กับรูปแบบการเผยแพร่/ติดตาม สำหรับอุปกรณ์หลายเครื่องที่เลือกเข้าร่วมหัวข้อหนึ่งๆ คุณเขียนข้อความหัวข้อในฐานะ และ FCM จะจัดการเรื่องการกำหนดเส้นทางและการส่งข้อความไปทางด้านขวามือ อุปกรณ์

ตัวอย่างเช่น ผู้ใช้ข่าวในท้องถิ่น แอปการคาดการณ์สามารถเลือกรับ "การแจ้งเตือนกระแสน้ำขึ้น-น้ำลง" หัวข้อและรับ การแจ้งเตือนสภาวะการประมงน้ำเค็มที่เหมาะสมในพื้นที่ที่ระบุ ผู้ใช้แอปกีฬา สามารถสมัครรับการอัปเดตอัตโนมัติสำหรับคะแนนการแข่งขันสดสำหรับ ทีม

สิ่งที่ควรทราบเกี่ยวกับหัวข้อมีดังนี้

  • ข้อความตามหัวข้อเหมาะสมที่สุดสำหรับเนื้อหา เช่น สภาพอากาศ หรือเนื้อหาอื่นๆ แบบสาธารณะ ที่มีอยู่
  • ข้อความหัวข้อจะได้รับการเพิ่มประสิทธิภาพเพื่ออัตราการส่งข้อมูลมากกว่าเวลาในการตอบสนอง เพื่อการจัดส่งที่รวดเร็วและปลอดภัย อุปกรณ์เดียวหรือกลุ่มเล็กๆ ข้อความเป้าหมายไปยังโทเค็นการลงทะเบียน ไม่ใช่หัวข้อ
  • หากต้องการส่งข้อความไปยังอุปกรณ์หลายเครื่องต่อผู้ใช้ โปรดพิจารณา การรับส่งข้อความกลุ่มของอุปกรณ์ สำหรับกรณีการใช้งานเหล่านั้น
  • การรับส่งข้อความตามหัวข้อรองรับการสมัครใช้บริการแบบไม่จำกัดสำหรับแต่ละหัวข้อ อย่างไรก็ตาม FCM บังคับใช้ขีดจำกัดในด้านต่อไปนี้
    • อินสแตนซ์ของแอป 1 รายการจะสมัครรับข้อมูลได้ไม่เกิน 2,000 หัวข้อ
    • หากคุณกำลังใช้ การนำเข้าเป็นกลุ่ม เพื่อสมัครใช้บริการอินสแตนซ์แอป คำขอแต่ละรายการจะจำกัดอินสแตนซ์แอปไว้ที่ 1, 000 รายการ
    • ระบบจะจำกัดอัตราความถี่ของการสมัครใช้บริการใหม่ต่อโปรเจ็กต์ หากส่งอีเมลหลายรายการเกินไป คำขอสมัครสมาชิกในช่วงเวลาสั้นๆ เซิร์ฟเวอร์ FCM จะตอบสนองด้วย การตอบกลับ 429 RESOURCE_EXHAUSTED ("เกินโควต้า") ลองอีกครั้งโดยใช้ Exponential Backoff

สมัครรับข้อมูลหัวข้อในแอปไคลเอ็นต์

แอปไคลเอ็นต์สามารถสมัครรับข้อมูลหัวข้อที่มีอยู่ หรือสามารถสร้างหัวข้อใหม่ หัวข้อ เมื่อแอปไคลเอ็นต์สมัครรับชื่อหัวข้อใหม่ (ประเภทที่ สำหรับโปรเจ็กต์ Firebase ของคุณ) หัวข้อใหม่ในชื่อนี้คือ ที่สร้างใน FCM และลูกค้าใดๆ สามารถสมัครรับข้อมูลในภายหลังได้

หากต้องการสมัครรับข้อมูลหัวข้อ แอปไคลเอ็นต์จะเรียก Firebase Cloud Messaging subscribeToTopic() ที่มีชื่อหัวข้อ FCM วิธีนี้ จะแสดงผล Task ซึ่งผู้ฟังที่ฟังจนจบจะใช้กลุ่มนี้ได้เพื่อดูว่า การสมัครใช้บริการสำเร็จ:

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

ในการยกเลิกการสมัคร แอปไคลเอ็นต์จะเรียก Firebase Cloud Messaging unsubscribeFromTopic() ด้วยชื่อหัวข้อ

จัดการการสมัครรับข้อมูลตามหัวข้อบนเซิร์ฟเวอร์

Firebase Admin SDK ทำให้คุณสามารถดำเนินการขั้นพื้นฐาน งานการจัดการหัวข้อจากฝั่งเซิร์ฟเวอร์ จากการลงทะเบียน โทเค็น คุณสามารถสมัครใช้บริการและยกเลิกการสมัครรับอีเมลในอินสแตนซ์ของแอปไคลเอ็นต์จำนวนมากได้โดยใช้ ตรรกะของเซิร์ฟเวอร์

คุณสามารถสมัครใช้บริการอินสแตนซ์แอปไคลเอ็นต์กับหัวข้อที่มีอยู่ได้ หรือ คุณสามารถสร้างหัวข้อใหม่ได้ เมื่อคุณใช้ API เพื่อสมัครใช้บริการแอปไคลเอ็นต์ ไปยังหัวข้อใหม่ (เป็นหัวข้อที่ยังไม่มีอยู่ในโปรเจ็กต์ Firebase) ระบบจะสร้างหัวข้อใหม่ของชื่อนั้นใน FCM และจากนั้นลูกค้าสามารถ สมัครรับข้อมูล

คุณส่งรายการโทเค็นการลงทะเบียนไปยัง Firebase Admin SDK ได้ วิธีสมัครใช้บริการเพื่อสมัครใช้บริการหัวข้อในอุปกรณ์ที่เกี่ยวข้อง

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

Admin FCM API ยังให้คุณยกเลิกการสมัครอุปกรณ์จากหัวข้อได้ด้วย โดยส่งโทเค็นการลงทะเบียนให้กับ วิธีการ:

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

เมธอด subscribeToTopic() และ unsubscribeFromTopic() จะทําให้เกิด ที่มีการตอบสนองจาก FCM ประเภทการแสดงผล โดยไม่คำนึงถึงจำนวนของโทเค็นการลงทะเบียนที่ระบุไว้ใน อีกครั้ง

ในกรณีที่เกิดข้อผิดพลาด (การตรวจสอบสิทธิ์ล้มเหลว โทเค็นหรือหัวข้อไม่ถูกต้อง ฯลฯ) วิธีการเหล่านี้จะทำให้เกิดข้อผิดพลาด ดูรายการรหัสข้อผิดพลาดทั้งหมดรวมถึงคำอธิบาย และขั้นตอนการแก้ปัญหาได้ที่ ข้อผิดพลาดของ Admin FCM API

รับและจัดการข้อความตามหัวข้อ

FCM ส่งข้อความหัวข้อในลักษณะเดียวกับที่ปลายทางอื่นๆ ข้อความ

ในการรับข้อความ โปรดใช้บริการแบบขยาย FirebaseMessagingService บริการของคุณควรลบล้าง onMessageReceived และ onDeletedMessages Callback

กรอบเวลาในการจัดการข้อความอาจสั้นกว่า 20 วินาที ขึ้นอยู่กับความล่าช้าต่างๆ เกิดขึ้นก่อนการเรียกใช้ onMessageReceived ซึ่งรวมถึงความล่าช้าของระบบปฏิบัติการ เวลาเริ่มต้นแอป เทรดหลักถูกบล็อกโดยการดำเนินการอื่นๆ หรือ onMessageReceived ก่อนหน้า การโทรใช้เวลานานเกินไป หลังจากนั้น ลักษณะการทำงานต่างๆ ของระบบปฏิบัติการ เช่น ประมวลผล การหยุดทำงาน หรือของ Android O ขีดจำกัดการดำเนินการในเบื้องหลังอาจรบกวนความสามารถในการทำงานของคุณ

onMessageReceived มีให้สำหรับข้อความส่วนใหญ่ โดยมีสิ่งต่อไปนี้ ข้อยกเว้น:

  • ข้อความแจ้งเตือนที่ส่งเมื่อแอปของคุณทำงานอยู่เบื้องหลัง ด้วยวิธีนี้ การแจ้งเตือนจะส่งไปยังถาดระบบของอุปกรณ์ ผู้ใช้แตะการแจ้งเตือน เปิดตัวเปิดแอปโดยค่าเริ่มต้น

  • ข้อความที่มีทั้งข้อมูลการแจ้งเตือนและเพย์โหลดข้อมูล เมื่อได้รับในเบื้องหลัง ในกรณีนี้ ระบบจะส่งการแจ้งเตือนไปยังถาดระบบของอุปกรณ์ และเพย์โหลดข้อมูลจะส่งไปในส่วนเพิ่มเติมของ Intent ของกิจกรรม Launcher

บทสรุปมีดังนี้:

สถานะของแอป การแจ้งเตือน ข้อมูล ทั้งสอง
พื้นหน้า onMessageReceived onMessageReceived onMessageReceived
ความเป็นมา ถาดระบบ onMessageReceived การแจ้งเตือน: ถาดระบบ
ข้อมูล: ข้อมูลเพิ่มเติมเกี่ยวกับความตั้งใจ
โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับประเภทข้อความที่หัวข้อ การแจ้งเตือนและ ข้อความข้อมูล

แก้ไขไฟล์ Manifest ของแอป

หากต้องการใช้FirebaseMessagingService คุณต้องเพิ่มสิ่งต่อไปนี้ใน ไฟล์ Manifest ของแอป:

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

นอกจากนี้ ขอแนะนำให้คุณกำหนดค่าเริ่มต้นเพื่อปรับแต่งรูปลักษณ์ของการแจ้งเตือนด้วย คุณ สามารถระบุไอคอนเริ่มต้นที่กำหนดเอง และสีเริ่มต้นที่กำหนดเอง ซึ่งจะใช้เมื่อใดก็ได้ ไม่ได้ตั้งค่าที่เทียบเท่าในเพย์โหลดการแจ้งเตือน

เพิ่มบรรทัดเหล่านี้ลงในแท็ก แท็ก application เพื่อตั้งค่าไอคอนเริ่มต้นที่กำหนดเองและสีที่กำหนดเอง

<!-- 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 แสดงไอคอนเริ่มต้นที่กำหนดเองสำหรับ

  • ข้อความแจ้งเตือนทั้งหมดที่ส่งจาก การเขียนการแจ้งเตือน
  • ข้อความแจ้งเตือนที่ไม่ได้ตั้งค่าไอคอนในเพย์โหลดการแจ้งเตือนอย่างชัดเจน

Android ใช้สีเริ่มต้นที่กำหนดเองสำหรับ

  • ข้อความแจ้งเตือนทั้งหมดที่ส่งจาก การเขียนการแจ้งเตือน
  • ข้อความแจ้งเตือนที่ไม่ได้ระบุสีในการแจ้งเตือนอย่างชัดเจน เพย์โหลด

หากไม่มีการตั้งค่าไอคอนเริ่มต้นที่กำหนดเอง และไม่มีการตั้งค่าไอคอนในเพย์โหลดการแจ้งเตือน Android แสดงไอคอนแอปพลิเคชันในรูปแบบสีขาว

ลบล้าง onMessageReceived

เมื่อลบล้างเมธอด FirebaseMessagingService.onMessageReceived คุณสามารถดำเนินการตาม ข้อความระยะไกล และรับข้อมูลข้อความ:

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

ในบางกรณี FCM อาจไม่ส่งข้อความ เหตุการณ์นี้จะเกิดขึ้นเมื่อมีจำนวนโฆษณาจำนวนมากเกินไป ข้อความ (>100) ที่รอดำเนินการสำหรับ แอปในอุปกรณ์ที่เฉพาะเจาะจงในขณะที่เชื่อมต่อ หรือหากอุปกรณ์ไม่ได้เชื่อมต่อ FCM ในมากกว่า 1 เดือน ในกรณีเหล่านี้ คุณอาจได้รับการติดต่อกลับทาง FirebaseMessagingService.onDeletedMessages() เมื่ออินสแตนซ์ของแอปได้รับ Callback นี้ อุปกรณ์ควรจะทำการซิงค์โดยสมบูรณ์กับเซิร์ฟเวอร์แอปพลิเคชันของคุณ ถ้าคุณยังไม่ได้ส่งข้อความถึงแอปในนั้น อุปกรณ์ภายใน 4 สัปดาห์ที่ผ่านมา FCM จะไม่โทรติดต่อ onDeletedMessages()

จัดการข้อความแจ้งเตือนในแอปที่ทำงานอยู่เบื้องหลัง

เมื่อแอปอยู่ในเบื้องหลัง Android จะส่งข้อความการแจ้งเตือนไปยัง ถาดระบบ ผู้ใช้แตะการแจ้งเตือนดังกล่าวจะเปิดตัวเปิดแอปด้วย "ค่าเริ่มต้น"

ซึ่งรวมถึงข้อความที่มีทั้งการแจ้งเตือนและข้อมูล เพย์โหลด (และข้อความทั้งหมดที่ส่งจากคอนโซลการแจ้งเตือน) ในกรณีเหล่านี้ ระบบจะส่งการแจ้งเตือนไปยังอุปกรณ์ ถาดระบบ และเพย์โหลดข้อมูลจะแสดงในส่วนที่เกินมาของ Intent ของกิจกรรม Launcher

ดูข้อมูลเชิงลึกเกี่ยวกับการส่งข้อความไปที่แอปได้ที่ แดชบอร์ดการรายงาน FCM ซึ่งบันทึก จำนวนข้อความที่ส่งและเปิดบนอุปกรณ์ Apple และ Android พร้อมกับ ข้อมูลสำหรับ "การแสดงผล" (การแจ้งเตือนที่ผู้ใช้เห็น) สำหรับแอป Android

สร้างคำขอส่งคำขอ

หลังจากสร้างหัวข้อแล้ว ไม่ว่าจะด้วยการสมัครใช้บริการอินสแตนซ์แอปไคลเอ็นต์ หัวข้อในฝั่งไคลเอ็นต์หรือผ่าน API ของเซิร์ฟเวอร์ คุณสามารถส่งข้อความไปยัง หัวข้อ หากนี่เป็นครั้งแรกที่คุณสร้างส่งคำขอสำหรับ FCM ดูคู่มือเพื่อ สภาพแวดล้อมของเซิร์ฟเวอร์และ FCM ให้ ความเป็นมาที่สำคัญและข้อมูลการตั้งค่า

ระบุชื่อหัวข้อที่ต้องการในตรรกะการส่งบนแบ็กเอนด์ ดังต่อไปนี้

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:

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

หากต้องการส่งข้อความไปยังกลุ่มหัวข้อ ระบุ condition ซึ่งเป็นนิพจน์บูลีนที่ระบุพารามิเตอร์ หัวข้อเป้าหมาย ตัวอย่างเช่น เงื่อนไขต่อไปนี้จะส่งข้อความถึง อุปกรณ์ที่สมัครใช้บริการ TopicA และ TopicB หรือ TopicC

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

FCM จะประเมินเงื่อนไขใดๆ ในวงเล็บก่อน จากนั้นจึงประเมิน นิพจน์จากซ้ายไปขวา ในนิพจน์ข้างต้น ผู้ใช้สมัครรับข้อมูล หัวข้อใดหัวข้อหนึ่งไม่ได้รับข้อความ ในทำนองเดียวกัน ผู้ใช้ที่ไม่ การติดตาม TopicA ไม่ได้รับข้อความ การผสมผสานเหล่านี้ รับเลย

  • TopicA และ TopicB
  • TopicA และ TopicC

คุณสามารถรวมหัวข้อไว้ในนิพจน์แบบมีเงื่อนไขได้สูงสุด 5 หัวข้อ

วิธีส่งไปยังเงื่อนไข

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:

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

ขั้นตอนถัดไป