จัดการการติดตามหัวข้อ

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

  • ในเซิร์ฟเวอร์โดยใช้ FCM topic subscription server API หรือ Firebase Admin SDK

  • ในไคลเอ็นต์ ให้ใช้ API ฝั่งไคลเอ็นต์ภายในแอป

จัดการการสมัครใช้บริการหัวข้อโดยใช้ Topic Subscription Server API

หากต้องการสมัครใช้หัวข้อโดยใช้การลงทะเบียน FCM ให้ส่งรหัสการลงทะเบียน (รหัสการติดตั้ง Firebase หรือโทเค็นการลงทะเบียน FCM) ไปยัง FCM topic subscription server API ตามที่แสดง

REST

POST https://fcm.googleapis.com/v1/projects/${PROJECT_ID}/registrations/${REGISTRATION_ID}/topicSubscriptions?topic_name=${TOPIC_NAME}

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

{}

คำสั่ง curl

curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{}'
https://fcm.googleapis.com/v1/projects/${PROJECT_ID}/registrations/${REGISTRATION_ID}/topicSubscriptions?topic_name=${TOPIC_NAME}

เมื่อสำเร็จ การตอบกลับ HTTP v1 API จะเป็นออบเจ็กต์ JSON ที่มีชื่อทรัพยากร ชื่อหัวข้อ และการประทับเวลา

    {
      "topic_name": "${TOPIC_NAME}",
      "create_time": "2026-01-15T01:30:15.01Z"
    }

FCM API การสมัครรับหัวข้อ V1 ยังช่วยให้คุณยกเลิกการสมัครรับข้อมูลโทเค็นจากหัวข้อผ่านคำขอ DELETE ได้ด้วย

REST

DELETE https://fcm.googleapis.com/v1/projects/${PROJECT_ID}/registrations/${REGISTRATION_ID}/topicSubscriptions/${TOPIC_NAME}

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

{}

คำสั่ง curl

curl -X DELETE -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{}'
https://fcm.googleapis.com/v1/projects/${PROJECT_ID}/registrations/${REGISTRATION_ID}/topicSubscriptions/${TOPIC_NAME}

นอกจากนี้ คุณยังแสดงรายการการสมัครรับข้อมูลหัวข้อของรหัสการลงทะเบียนผ่านคำขอ GET ได้ด้วย

REST

GET https://fcm.googleapis.com/v1/projects/${PROJECT_ID}/registrations/${REGISTRATION_ID}/topicSubscriptions

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

คำสั่ง curl

curl -X GET -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json"
https://fcm.googleapis.com/v1/projects/${PROJECT_ID}/registrations/${REGISTRATION_ID}/topicSubscriptions

เมื่อสำเร็จ การตอบกลับของ HTTP v1 API จะเป็นออบเจ็กต์ JSON ที่มีรายการการติดตามหัวข้อ

    {
        "topic_subscriptions": [
          {
              "topic_name": "${TOPIC_NAME1}",
              "create_time": "2026-01-15T01:30:15.01Z"
          },
          {
              "topic_name": "${TOPIC_NAME2}",
              "create_time": "2026-01-16T02:40:17.01Z"
          },
        ...
        ]
    }

จัดการการสมัครใช้บริการหัวข้อโดยใช้ Admin SDK

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

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

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

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().subscribeToTopicAsync(
    registrationTokens, topic).get();
// 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");

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

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().unsubscribeFromTopicAsync(
    registrationTokens, topic).get();
// 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 ประเภทการแสดงผลมีรูปแบบเดียวกัน ไม่ว่าจะมีโทเค็นการลงทะเบียนกี่รายการที่ระบุในคำขอ

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

จัดการการติดตามหัวข้อจากแอปไคลเอ็นต์

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

เลือกแพลตฟอร์มของคุณ

Android

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

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

Kotlin

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() พร้อมชื่อหัวข้อ

iOS

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

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

Swift

Messaging.messaging().subscribe(toTopic: "weather") { error in
  print("Subscribed to weather topic")
}

Objective-C

[[FIRMessaging messaging] subscribeToTopic:@"weather"
                                completion:^(NSError * _Nullable error) {
  NSLog(@"Subscribed to weather topic");
}];

การเรียกนี้จะส่งคำขอแบบอะซิงโครนัสไปยังแบ็กเอนด์ FCM และสมัครใช้บริการไคลเอ็นต์ในหัวข้อที่ระบุ ก่อนโทรหา subscribeToTopic:topic โปรดตรวจสอบว่าอินสแตนซ์แอปไคลเอ็นต์ได้รับโทเค็นการลงทะเบียนผ่าน การเรียกกลับ didReceiveRegistrationToken แล้ว

ทุกครั้งที่แอปเริ่มต้นทำงาน FCM จะตรวจสอบว่าได้ติดตามหัวข้อที่ขอทั้งหมดแล้ว หากต้องการ ยกเลิกการสมัครรับข้อมูล ให้โทรไปที่ unsubscribeFromTopic:topic และ FCM จะยกเลิกการสมัครรับข้อมูลหัวข้อดังกล่าวในเบื้องหลัง

C++

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

::firebase::messaging::Subscribe("example");

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

หากต้องการยกเลิกการสมัครรับข้อมูล ให้โทรไปที่ ::firebase::messaging::Unsubscribe และ FCM จะยกเลิกการสมัครรับข้อมูลหัวข้อดังกล่าวในเบื้องหลัง

Unity

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

Firebase.Messaging.FirebaseMessaging.Subscribe("/topics/example");

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

หากต้องการยกเลิกการติดตาม ให้โทรไปที่ Firebase.Messaging.FirebaseMessaging.Unsubscribe และ FCM จะยกเลิกการติดตามหัวข้อในเบื้องหลัง

การจัดการหัวข้อฝั่งเซิร์ฟเวอร์เดิม (เลิกใช้งานแล้ว)

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

จัดการการติดตามหัวข้อเมื่อมีการเปลี่ยนแปลง FID หรือโทเค็น

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

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