আপনি সার্ভার বা ক্লায়েন্ট থেকে কোনও টপিকে ক্লায়েন্ট অ্যাপ সাবস্ক্রাইব করতে পারেন:
সার্ভারে, FCM টপিক সাবস্ক্রিপশন সার্ভার API বা Firebase Admin SDK ব্যবহার করে।
ক্লায়েন্টে, আপনার অ্যাপের মধ্যে ক্লায়েন্ট-সাইড API ব্যবহার করে।
বিষয় সাবস্ক্রিপশন সার্ভার API ব্যবহার করে বিষয় সাবস্ক্রিপশন ম্যানেজ করা
কোনও টপিকে FCM রেজিস্ট্রেশন সাবস্ক্রাইব করতে, দেখানো FCM টপিক সাবস্ক্রিপশন সার্ভার API-তে রেজিস্ট্রেশন আইডি (Firebase ইনস্টলেশন আইডি বা 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"
}
FCM V1 টপিক সাবস্ক্রিপশন API, 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 আপনাকে সার্ভার সাইড থেকে বিষয় ম্যানেজমেন্ট সংক্রান্ত প্রাথমিক কাজ করতে দেয়। তাদের রেজিস্ট্রেশন টোকেন দেওয়া থাকলে, আপনি সার্ভার লজিক ব্যবহার করে বাল্কে ক্লায়েন্ট অ্যাপ ইনস্ট্যান্স সাবস্ক্রাইব ও আনসাবস্ক্রাইব করতে পারবেন।
আপনি আগে থেকে থাকা যেকোনও টপিকে ক্লায়েন্ট অ্যাপ ইনস্ট্যান্স সাবস্ক্রাইব করতে পারেন অথবা নতুন টপিক তৈরি করতে পারেন। আপনি কোনও ক্লায়েন্ট অ্যাপকে নতুন টপিকে (আপনার Firebase প্রোজেক্টে আগে থেকে নেই এমন কোনও টপিক) সাবস্ক্রাইব করার জন্য API ব্যবহার করলে, 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);
});
জাভা
// 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);
});
জাভা
// 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-এ তৈরি হয় এবং যেকোনও ক্লায়েন্ট পরে সেটিতে সাবস্ক্রাইব করতে পারে।
কোনও বিষয়ে সাবস্ক্রাইব করতে, ক্লায়েন্ট অ্যাপ FCM বিষয়ের নাম সহ Firebase Cloud Messaging
subscribeToTopic() কল করে। এই পদ্ধতি
একটি 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 ব্যাকগ্রাউন্ডে টপিক থেকে আনসাবস্ক্রাইব করে দেয়।
লিগ্যাসি সার্ভার-সাইড বিষয় ম্যানেজমেন্ট (বন্ধ হয়ে গেছে)
ইনস্ট্যান্স আইডি কী তা বুঝতে, ইনস্ট্যান্স আইডি পৃষ্ঠা দেখুন। সচল নয় এমন এন্ডপয়েন্ট সম্পর্কে আরও জানতে, ইনস্ট্যান্স আইডি API রেফারেন্স দেখুন।
FID বা টোকেন পরিবর্তন হলে বিষয়ভিত্তিক সাবস্ক্রিপশন ম্যানেজ করা
কোনও অ্যাপের FID (Firebase ইনস্টলেশন আইডি) বা FCM টোকেন পরিবর্তন হলে, পুরনো FID বা টোকেনের সাথে যুক্ত বিষয়ভিত্তিক সাবস্ক্রিপশন মাইগ্রেট করা হয় না এবং এর ফলে নতুন শনাক্তকারীর কোনও বিষয়ভিত্তিক সাবস্ক্রিপশন থাকে না। সাধারণত, অ্যাপ আপডেট বা টোকেন রিফ্রেশ করার সময় টোকেন পরিবর্তন হয় না। টোকেন পরিবর্তনের সবচেয়ে সাধারণ কারণ হল FID মুছে দেওয়া/রোটেট করা, যা Firebase ইনস্টলেশন আইডির লাইফসাইকেল মনিটর করুন ফলো করে মনিটর করা যায়।
আপনি যদি FID বা টোকেন পরিবর্তনের সময় বিষয় সাবস্ক্রিপশন ধরে রাখতে চান, তাহলে আপনাকে ক্লায়েন্ট বা ব্যাকএন্ডে বিষয় সাবস্ক্রিপশন ডেটার ব্যাক-আপ নিতে হবে এবং অ্যাপ ইনস্ট্যান্স আগে যেসব বিষয়ে সাবস্ক্রাইব করেছিল সেগুলিতে নতুন শনাক্তকারীকে সাবস্ক্রাইব করতে হবে। Firebase এইসব সাবস্ক্রিপশন ট্র্যাক বা মাইগ্রেট করার জন্য কোনও অটোমেটিক ফিচার বা সুবিধা প্রদান করে না। এটি এমন একটি টাস্ক যা আপনাকে নিজের অ্যাপ ও ব্যাকএন্ডে ম্যানুয়ালি প্রয়োগ করতে হবে।