คุณสามารถสมัครใช้บริการแอปไคลเอ็นต์ในหัวข้อจากเซิร์ฟเวอร์หรือไคลเอ็นต์ก็ได้ โดยทำดังนี้
ในเซิร์ฟเวอร์ โดยใช้ FCM topic subscription server API หรือ Firebase Admin SDK
ในฝั่งไคลเอ็นต์ โดยใช้ API ฝั่งไคลเอ็นต์ภายในแอป
จัดการการสมัครใช้บริการหัวข้อโดยใช้ API ของเซิร์ฟเวอร์การสมัครใช้บริการหัวข้อ
หากต้องการสมัครใช้บริการการลงทะเบียน FCM ในหัวข้อ ให้ส่งรหัสการลงทะเบียน (รหัสการติดตั้ง Firebase หรือโทเค็นการลงทะเบียน FCM) ไปยัง API เซิร์ฟเวอร์การสมัครใช้บริการหัวข้อ FCM ดังที่แสดง
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"
}
นอกจากนี้ API การสมัครใช้บริการหัวข้อ FCM 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 เพื่อสมัครรับข้อมูลหัวข้อสำหรับอุปกรณ์ที่เกี่ยวข้องได้ ดังนี้
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 ซึ่ง Listener การดำเนินการเสร็จสมบูรณ์สามารถใช้เพื่อระบุว่าการสมัครใช้บริการสำเร็จหรือไม่ ดังนี้
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 โปรดตรวจสอบว่าอินสแตนซ์แอปไคลเอ็นต์ได้รับโทเค็นการลงทะเบียนผ่าน Callback 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 ไม่มีฟีเจอร์หรือความสามารถอัตโนมัติในการติดตามหรือย้ายข้อมูลการสมัครใช้บริการเหล่านี้ ซึ่งเป็นงานที่คุณต้องดำเนินการด้วยตนเองในแอปและแบ็กเอนด์