Catch up on everthing we announced at this year's Firebase Summit. Learn more

ส่งข้อความไปยังอุปกรณ์หลายเครื่อง

Firebase Cloud Messaging มีสองวิธีในการกำหนดเป้าหมายข้อความไปยังอุปกรณ์หลายเครื่อง:

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

ตั้งค่า SDK

ส่วนนี้อาจครอบคลุมขั้นตอนที่คุณเสร็จสิ้นแล้วถ้าคุณได้ ตั้งค่าแอปลูกค้า Android สำหรับ FCM หรือทำงานผ่านขั้นตอนในการ ส่งข้อความแรกของคุณ

ก่อนจะเริ่ม

  • ติดตั้งหรือปรับปรุง Android สตูดิโอ กับรุ่นใหม่ล่าสุดของ

  • ตรวจสอบให้แน่ใจว่าโครงการของคุณตรงตามข้อกำหนดเหล่านี้:

    • เป้าหมาย API ระดับ 19 (KitKat) หรือสูงกว่า
    • ใช้ Android 4.4 หรือสูงกว่า
    • ใช้ Jetpack (AndroidX) ซึ่งรวมถึงการประชุมความต้องการรุ่นเหล่านี้:
      • com.android.tools.build:gradle v3.2.1 หรือในภายหลัง
      • compileSdkVersion 28 หรือในภายหลัง
  • ตั้งค่าอุปกรณ์ทางกายภาพหรือใช้ โปรแกรมจำลอง การทำงานของแอป
    โปรดทราบว่า Firebase SDKs กับการพึ่งพาบริการ Google Play ของคุณ ต้องใช้อุปกรณ์หรือโปรแกรมจำลองจะมีบริการ Google Play ติดตั้ง

  • ลงชื่อเข้าใช้ Firebase ใช้บัญชี Google ของคุณ

หากคุณไม่ได้มีโครงการ Android และเพียงต้องการที่จะลองผลิตภัณฑ์ Firebase คุณสามารถดาวน์โหลดหนึ่งของเรา ตัวอย่าง QuickStart

สร้างโปรเจ็กต์ Firebase

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

ลงทะเบียนแอปของคุณด้วย Firebase

หากต้องการใช้ Firebase ในแอป Android คุณต้องลงทะเบียนแอปกับโปรเจ็กต์ Firebase การลงทะเบียนแอพของคุณมักจะเรียกว่า "การเพิ่ม" แอพของคุณในโครงการของคุณ

  1. ไปที่ คอนโซล Firebase

  2. ในใจกลางของหน้าภาพรวมโครงการคลิกไอคอน Android ( ) หรือเพิ่มแอปจะเปิดตัวเวิร์กโฟลว์การติดตั้ง

  3. ใส่ชื่อแพคเกจของแอปใน Android ฟิลด์ชื่อแพคเกจ

  4. (อุปกรณ์เสริม) ป้อนข้อมูลตรวจสอบอื่น ๆ : ชื่อเล่น App และหนังสือรับรองการลงนาม Debug SHA-1

  5. คลิกแอปสมัครสมาชิก

เพิ่มไฟล์การกำหนดค่า Firebase

  1. เพิ่มไฟล์การกำหนดค่า Firebase Android ในแอปของคุณ:

    1. คลิกดาวน์โหลด google-services.json ที่จะได้รับไฟล์ config ของคุณ Firebase Android ( google-services.json )

    2. ย้ายไฟล์ปรับแต่งของคุณไปที่ไดเร็กทอรีโมดูล (ระดับแอป) ของแอปของคุณ

  2. ต้องการเปิดใช้งานผลิตภัณฑ์ Firebase ใน app ของคุณเพิ่ม google-บริการปลั๊กอิน ไปยังไฟล์ Gradle ของคุณ

    1. ในระดับรากของคุณ (ระดับโครงการ) ไฟล์ Gradle ( build.gradle ), เพิ่มกฎระเบียบที่จะรวมปลั๊กอิน Google บริการ Gradle ตรวจสอบว่าคุณมีที่เก็บ Maven ของ 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.10'  // Google Services plugin
        }
      }
      
      allprojects {
        // ...
      
        repositories {
          // Check that you have the following line (if not, add it):
          google()  // Google's Maven repository
          // ...
        }
      }
      
    2. ในโมดูลของคุณ (app ระดับ) ไฟล์ Gradle (ปกติ app/build.gradle ) ใช้ปลั๊กอิน Google บริการ Gradle:

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

เพิ่ม Firebase SDK ให้กับแอปของคุณ

  1. ใช้ Firebase Android BoM ประกาศพึ่งพาสำหรับห้องสมุด Firebase Cloud Messaging Android ในโมดูลของคุณ (app ระดับ) ไฟล์ Gradle (ปกติ app/build.gradle )

    สำหรับประสบการณ์ที่ดีที่สุดกับ Firebase Cloud Messaging เราขอแนะนำให้ เปิดใช้งาน Google Analytics ในโครงการ Firebase ของคุณและเพิ่ม Firebase SDK สำหรับ Google Analytics เพื่อ app ของคุณ

    Java

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

    โดยใช้ Firebase Android BoM แอปของคุณมักจะใช้รุ่นที่รองรับการห้องสมุด Firebase Android

    (ทางเลือก) ประกาศ Firebase อ้างอิงห้องสมุดโดยไม่ต้องใช้ BoM

    หากคุณเลือกที่จะไม่ใช้ Firebase BoM คุณต้องระบุเวอร์ชันไลบรารี Firebase แต่ละเวอร์ชันในบรรทัดการพึ่งพา

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

    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:23.0.0'
        implementation 'com.google.firebase:firebase-analytics:20.0.0'
    }
    

    คอตลิน+KTX

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

    โดยใช้ Firebase Android BoM แอปของคุณมักจะใช้รุ่นที่รองรับการห้องสมุด Firebase Android

    (ทางเลือก) ประกาศ Firebase อ้างอิงห้องสมุดโดยไม่ต้องใช้ BoM

    หากคุณเลือกที่จะไม่ใช้ Firebase BoM คุณต้องระบุเวอร์ชันไลบรารี Firebase แต่ละเวอร์ชันในบรรทัดการพึ่งพา

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

    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:23.0.0'
        implementation 'com.google.firebase:firebase-analytics-ktx:20.0.0'
    }
    

  2. ซิงค์แอปของคุณเพื่อให้แน่ใจว่าการขึ้นต่อกันทั้งหมดมีเวอร์ชันที่จำเป็น

สมัครสมาชิกแอพไคลเอนต์ในหัวข้อ

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

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

Java

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

คอตลิน+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()
        }

ต้องการยกเลิกการสมัคร app ลูกค้าเรียก Firebase Cloud Messaging unsubscribeFromTopic() ที่มีชื่อหัวข้อ

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

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

จะได้รับข้อความให้ใช้บริการที่ขยาย FirebaseMessagingService บริการของคุณควรแทนที่ onMessageReceived และ onDeletedMessages เรียกกลับ ควรจัดการข้อความภายใน 20 วินาทีหลังจากได้รับ (10 วินาทีใน Android Marshmallow) หน้าต่างเวลาอาจจะสั้นขึ้นอยู่กับความล่าช้าของระบบปฏิบัติการที่เกิดขึ้นข้างหน้าของการเรียก onMessageReceived หลังจากนั้นพฤติกรรม OS ต่างๆเช่น Android โอ ขีด จำกัด ของการดำเนินการพื้นหลัง อาจจะยุ่งเกี่ยวกับความสามารถของคุณเพื่อให้การทำงานของคุณ สำหรับข้อมูลเพิ่มเติมโปรดดูที่ภาพรวมของเราในการ จัดลำดับความสำคัญข้อความ

onMessageReceived มีไว้สำหรับประเภทข้อความส่วนใหญ่มีข้อยกเว้นต่อไปนี้:

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

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

สรุป:

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

แก้ไขรายการแอป

หากต้องการใช้ 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 คุณสามารถดำเนินการบนพื้นฐานที่ได้รับ RemoteMessage วัตถุและได้รับข้อมูลที่เป็นข้อความ:

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

คอตลิน+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}")

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

แทนที่ onDeletedMessages

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

จัดการข้อความแจ้งเตือนในแอปพื้นหลัง

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

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

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

แอปที่จำกัดในเบื้องหลัง (Android P หรือใหม่กว่า)

FCM อาจไม่ส่งข้อความไปยังปพลิเคชันที่ถูกใส่ลงไปใน ข้อ จำกัด พื้นหลัง โดยผู้ใช้ (เช่นผ่าน: Setting -> ปพลิเคชันและประกาศ -> [APPNAME] -> Battery) เมื่อแอปของคุณถูกลบออกจากการจำกัดพื้นหลังแล้ว ข้อความใหม่ไปยังแอปจะถูกส่งเหมือนเดิม เพื่อที่จะป้องกันไม่ให้ข้อความหายไปและส่งผลกระทบต่อข้อ จำกัด พื้นฐานอื่น ๆ ให้แน่ใจว่าจะหลีกเลี่ยงพฤติกรรมที่ไม่ดีโดยระบุ Android ตับ ความพยายาม ลักษณะการทำงานเหล่านี้อาจทำให้อุปกรณ์ Android แนะนำให้ผู้ใช้ทราบว่าแอปของคุณถูกจำกัดการทำงานในเบื้องหลัง แอปของคุณสามารถตรวจสอบหากมีการใช้พื้นหลัง จำกัด : isBackgroundRestricted ()

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

หลังจากที่คุณได้สร้างหัวข้อทั้งโดยสมัครกรณี app ลูกค้ากับหัวข้อในฝั่งไคลเอ็นต์หรือผ่านทาง เซิร์ฟเวอร์ 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)

ไป

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

ค#

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

พักผ่อน

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

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

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

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

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

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

ในการส่งไปยังเงื่อนไข:

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)

ไป

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

ค#

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

พักผ่อน

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

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