Topic Subscription — механизам Firebase Cloud Messaging који омогућава груписање уређаја по интересима и слање обавештења целим категоријама претплатника. Уместо слања на хиљаде појединачних Registration Token-а, довољно је послати једну поруку на тему. Према подацима Firebase, 2025, Topic Subscription се користи у вестима, спортским преносима и маркетиншким кампањама за масовну испоруку обавештења.
Главно
Topic Subscription — је механизам групног слања пусх обавештења, при чему се уређаји претплаћују на именоване канале (теме) и примају поруке послате на те канале. Свака тема се идентификује називом, на пример news_sports или weather_alerts.
Када се уређај претплати на тему, FCM додаје његов Registration Token у листу прималаца те теме. При слању поруке на тему, FCM аутоматски усмерава копију сваком претплаћеном уређају. Firebase не ограничава број претплата по уређају — апликација може да претплати корисника на десетине тема истовремено.
Главна предност тема је скалабилност. Да бисте послали обавештење милиону корисника, довољан је један HTTP захтев ка FCM-у са именом теме. Код индивидуалног слања било би потребно милион захтева или групно слање до 500 токена одједном. Теме такође поједностављују логику серверског дела — нема потребе за чувањем листи токена за сваку категорију.
| Параметар | Индивидуално слање | Topic Subscription |
|---|---|---|
| Број захтева | Један по токену или групно до 500 | Један по теми |
| Управљање претплатама | На серверу (листа токена) | На клијенту или серверу |
| Динамичке групе | Захтевају ажурирање листе | Аутоматски кроз претплату |
| Ограничење прималаца | До 500 у једном захтеву | Неограничено |
Topic Subscription се широко користи у апликацијама за вести за категоризацију садржаја — претплата на теме "Спорт", "Политика", "Технологије" омогућава испоруку релевантних обавештења. У e-commerce темама се користе за обавештења о попустима у одређеним категоријама производа. У месенџерима и друштвеним мрежама теме се користе за обавештења о догађајима у групама.
Firebase намеће ограничења за рад са темама. Једна апликација може имати до 2000 тема. Сваки уређај може да се претплати на највише 2000 тема. Учесталост претплата/отказивања је такође ограничена — не више од 3000 операција у минути по пројекту. Прекорачење лимита доводи до привремене блокаде. За пројекте са великим бројем тема препоручује се коришћење услова (condition) уместо теме — FCM подржава логичке изразе за циљање.
Процес Topic Subscription се састоји од три фазе: иницијализација претплате на клијенту, регистрација у инфраструктури FCM и потврда операције. Након успешне претплате, уређај почиње да прима поруке послате на ту тему.
Када клијент позове метод subscribeToTopic(), Firebase SDK шаље захтев на FCM сервере. Сервер проверава дозвољеност операције и додаје токен уређаја на листу претплатника теме. FCM враћа клијенту потврду о успешној претплати. Од тог тренутка, све поруке на ту тему биће достављене уређају.
Тему није потребно унапред креирати у Firebase конзоли. При првој претплати било ког уређаја на тему под именом news_promo, FCM је аутоматски креира. Ако последњи уређај откаже претплату, тема остаје у систему, али неактивна, и наставља са радом при новој претплати.
На Android-у претплата и отказавање претплате на теме се обављају путем FirebaseMessaging SDK-а. Методе subscribeToTopic() и unsubscribeFromTopic() примају име теме као параметар. Операције су асинхроне и захтевају обраду резултата.
За претплату је довољно позвати subscribeToTopic() са именом циљне теме. Firebase SDK самостално управља мрежним захтевима и поновљеним покушајима приликом отказа. Препоручује се претплата на теме након успешног добијања Registration Token-а.
class TopicSubscriber(private val context: Context) {
fun subscribeToNewsTopic() {
FirebaseMessaging.getInstance()
.subscribeToTopic("news_latest")
.addOnCompleteListener { task ->
val msg = if (task.isSuccessful) {
"Subscribed to news topic"
} else {
"Subscription failed"
}
Log.d("FCM", msg)
}
}
fun unsubscribeFromNewsTopic() {
FirebaseMessaging.getInstance()
.unsubscribeFromTopic("news_latest")
.addOnCompleteListener { task ->
Log.d("FCM", "Претплата отказана: ${task.isSuccessful}")
}
}
}
У реалним апликацијама, корисник се може претплатити на више категорија. За практично управљање направите класу-менаџер која синхронизује стање претплата са серверским делом. Приликом пријаве корисника, вратите његове претплате из профила.
class SubscriptionManager(private val context: Context) {
private val fcm = FirebaseMessaging.getInstance()
suspend fun syncSubscriptions(topics: List<String>) {
topics.forEach { topic ->
fcm.subscribeToTopic(topic).await()
}
}
suspend fun removeAllSubscriptions() {
val savedTopics = getSavedTopics()
savedTopics.forEach { topic ->
fcm.unsubscribeFromTopic(topic).await()
}
}
private fun getSavedTopics(): List<String> {
return listOf("news_latest", "promotions", "updates")
}
}
На iOS-у процес претплате на теме је идентичан по логици Android-у, али користи Swift API Firebase Messaging-а. Методе subscribe и unsubscribe се позивају на инстанци Messaging-а и такође су асинхроне.
За претплату на тему у iOS апликацији користи се метод Messaging.subscribe(). Важно је позвати претплату након иницијализације Firebase-а и добијања Registration Token-а. Apple препоручује тражење дозволе за обавештења пре претплате на теме.
import FirebaseMessaging
class PushTopicManager {
func subscribeToTopic(topic: String) {
Messaging.messaging().subscribe(toTopic: topic) { error in
if let error = error {
Log.e("FCM", "Грешка при претплати: \(error)")
} else {
Log.d("FCM", "Претплаћен на \(topic)")
}
}
}
func unsubscribeFromTopic(topic: String) {
Messaging.messaging().unsubscribe(fromTopic: topic) { error in
if let error = error {
Log.e("FCM", "Грешка при отказивању претплате: \(error)")
}
}
}
}
На iOS-у претплата на тему је такође везана за Registration Token који Firebase добија од APNs-а. Ако се APNs токен промени (на пример, након обнављања уређаја), Firebase аутоматски преноси претплате на нови токен. Међутим, у ретким случајевима може бити потребна поновна претплата након ажурирања Registration Token-а.
Серверско управљање претплатама омогућава претплату и отказавање претплате уређаја без учешћа клијентске апликације. Ово је корисно за администрирање, A/B тестирање и управљање претплатама на backend страни.
Firebase пружа REST API за масовно управљање претплатама. Метод /v1/projects/{project_id}/subscriptions омогућава претплату до 1000 уређаја у једном захтеву. API користи Registration Token уређаја за идентификацију.
const admin = require("firebase-admin")
async function subscribeUsersToTopic(tokens, topic) {
try {
const response = await admin
.messaging()
.subscribeToTopic(tokens, topic)
Log.info(`Success: ${response.successCount}`)
Log.info(`Failures: ${response.failureCount}`)
} catch (error) {
Log.error("Грешка при претплати", error)
}
}
Серверско управљање претплатама се користи у неколико сценарија. Приликом регистрације корисника, сервер га аутоматски претплаћује на основне теме. Приликом промене преференција у веб верзији, сервер синхронизује претплате на мобилном уређају. Администратори могу да претплате тест уређаје на интерне теме за отклањање грешака. За масовне операције, FCM пружа метод Instance Group, који омогућава управљање претплатама групе уређаја путем јединственог идентификатора групе.
Firebase не пружа уграђени API за проверу тренутних претплата уређаја. Програмерима се препоручује да воде сопствену базу претплата на серверској страни. Приликом сваког покретања апликације, клијент синхронизује своје претплате са сервером, шаљући листу активних тема. Ово омогућава откривање десинхронизације и враћање претплата по потреби. За ревизију користите Firebase Cloud Functions дневнике — свака subscribe/unsubscribe операција може бити забележена.
Често постављана питања
Максималан број тема је 2000 по апликацији. Ако вам је потребно више, размотрите коришћење група уређаја (Device Groups) или индивидуално слање по токенима.
Firebase не пружа директан API за добијање листе претплата уређаја. Програмерима се препоручује да чувају стање претплата на сопственом серверу и синхронизују га са клијентом.
FCM враћа успешан резултат. Firebase третира отказавање претплате са непостојеће теме као no-op операцију — не генеришу се грешке, стање се не мења.
Да, у Firebase конзоли у одељку Cloud Messaging можете изабрати тему као циљну публику и послати тестно или продукционо обавештење преко веб интерфејса.
Обично се претплата активира у року од неколико секунди. Међутим, у ретким случајевима кашњење може достићи 30–60 секунди због ширења информација по FCM серверима.
Завршни закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође