Đăng ký Chủ đề là cơ chế của Firebase Cloud Messaging cho phép nhóm các thiết bị theo sở thích và gửi thông báo đến toàn bộ danh mục người đăng ký. Thay vì gửi đến hàng nghìn Registration Token riêng lẻ, chỉ cần gửi một tin nhắn đến một chủ đề. Theo Firebase, 2025, Đăng ký Chủ đề được sử dụng trong các ứng dụng tin tức, chương trình phát sóng thể thao và chiến dịch tiếp thị để phân phối thông báo trên quy mô lớn.
Những điểm chính
Đăng ký Chủ đề là cơ chế phân phối thông báo push nhóm, trong đó các thiết bị đăng ký vào các kênh có tên (chủ đề) và nhận tin nhắn được gửi đến các kênh đó. Mỗi chủ đề được xác định bằng tên chuỗi, như news_sports hoặc weather_alerts.
Khi một thiết bị đăng ký một chủ đề, FCM thêm Registration Token của nó vào danh sách người nhận của chủ đề đó. Khi gửi tin nhắn đến chủ đề, FCM tự động định tuyến một bản sao đến mọi thiết bị đã đăng ký. Firebase không giới hạn số lượng đăng ký trên mỗi thiết bị — ứng dụng có thể đăng ký người dùng vào hàng chục chủ đề cùng lúc.
Ưu điểm chính của chủ đề là khả năng mở rộng. Để gửi thông báo cho một triệu người dùng, chỉ cần một yêu cầu HTTP đến FCM với tên chủ đề. Với gửi riêng lẻ, sẽ cần một triệu yêu cầu hoặc gửi theo lô lên đến 500 token mỗi lần. Chủ đề cũng đơn giản hóa logic máy chủ — không cần lưu trữ danh sách token cho từng danh mục.
| Tham số | Gửi riêng lẻ | Đăng ký Chủ đề |
|---|---|---|
| Số lượng yêu cầu | Một mỗi token hoặc lô đến 500 | Một mỗi chủ đề |
| Quản lý đăng ký | Trên máy chủ (danh sách token) | Trên máy khách hoặc máy chủ |
| Nhóm động | Cần cập nhật danh sách | Tự động qua đăng ký |
| Giới hạn người nhận | Lên đến 500 mỗi yêu cầu | Không giới hạn |
Đăng ký Chủ đề được sử dụng rộng rãi trong các ứng dụng tin tức để phân loại nội dung — đăng ký các chủ đề “Thể thao”, “Chính trị”, “Công nghệ” cho phép phân phối thông báo phù hợp. Trong thương mại điện tử, chủ đề được sử dụng cho thông báo về giảm giá trong các danh mục sản phẩm cụ thể. Trong ứng dụng nhắn tin và mạng xã hội, chủ đề được sử dụng cho thông báo về sự kiện trong nhóm.
Firebase áp đặt các hạn chế khi làm việc với chủ đề. Một ứng dụng có thể có tối đa 2000 chủ đề. Mỗi thiết bị có thể đăng ký tối đa 2000 chủ đề. Tần suất các thao tác đăng ký/hủy đăng ký cũng bị giới hạn — không quá 3000 thao tác mỗi phút cho mỗi dự án. Vượt quá các giới hạn này dẫn đến khóa tạm thời. Đối với các dự án có số lượng lớn chủ đề, nên sử dụng điều kiện (condition) thay vì chủ đề — FCM hỗ trợ biểu thức logic để nhắm mục tiêu.
Quy trình Đăng ký Chủ đề bao gồm ba giai đoạn: khởi tạo đăng ký trên máy khách, đăng ký trong cơ sở hạ tầng FCM và xác nhận thao tác. Sau khi đăng ký thành công, thiết bị bắt đầu nhận tin nhắn được gửi đến chủ đề đó.
Khi máy khách gọi phương thức subscribeToTopic(), Firebase SDK gửi yêu cầu đến máy chủ FCM. Máy chủ xác thực thao tác và thêm token thiết bị vào danh sách người đăng ký của chủ đề. FCM trả về cho máy khách xác nhận đăng ký thành công. Kể từ thời điểm này, tất cả tin nhắn đến chủ đề này sẽ được gửi đến thiết bị.
Không cần tạo chủ đề trước trong bảng điều khiển Firebase. Khi thiết bị đầu tiên đăng ký một chủ đề có tên news_promo, FCM tự động tạo ra nó. Nếu thiết bị cuối cùng hủy đăng ký, chủ đề vẫn tồn tại trong hệ thống nhưng không hoạt động và tiếp tục hoạt động khi có đăng ký mới.
Trên Android, việc đăng ký và hủy đăng ký chủ đề được thực hiện qua FirebaseMessaging SDK. Các phương thức subscribeToTopic() và unsubscribeFromTopic() nhận tên chủ đề làm tham số. Các thao tác không đồng bộ và yêu cầu xử lý kết quả.
Để đăng ký, chỉ cần gọi subscribeToTopic() với tên chủ đề mục tiêu. Firebase SDK tự động quản lý các yêu cầu mạng và thử lại khi thất bại. Nên đăng ký chủ đề sau khi nhận được Registration Token thành công.
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", "Đã hủy đăng ký: ${task.isSuccessful}")
}
}
}
Trong ứng dụng thực tế, người dùng có thể đăng ký nhiều danh mục. Để quản lý thuận tiện, hãy tạo một lớp quản lý đồng bộ hóa trạng thái đăng ký với máy chủ. Khi người dùng đăng nhập, khôi phục đăng ký của họ từ hồ sơ.
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")
}
}
Trên iOS, quy trình đăng ký chủ đề tương tự Android về mặt logic nhưng sử dụng Swift Firebase Messaging API. Các phương thức subscribe và unsubscribe được gọi trên phiên bản Messaging và cũng không đồng bộ.
Để đăng ký một chủ đề trong ứng dụng iOS, hãy sử dụng phương thức Messaging.subscribe(). Điều quan trọng là gọi đăng ký sau khi khởi tạo Firebase và nhận được Registration Token. Apple khuyến nghị yêu cầu quyền thông báo trước khi đăng ký chủ đề.
import FirebaseMessaging
class PushTopicManager {
func subscribeToTopic(topic: String) {
Messaging.messaging().subscribe(toTopic: topic) { error in
if let error = error {
Log.e("FCM", "Lỗi đăng ký: \(error)")
} else {
Log.d("FCM", "Đã đăng ký \(topic)")
}
}
}
func unsubscribeFromTopic(topic: String) {
Messaging.messaging().unsubscribe(fromTopic: topic) { error in
if let error = error {
Log.e("FCM", "Lỗi hủy đăng ký: \(error)")
}
}
}
}
Trên iOS, đăng ký chủ đề cũng được gắn với Registration Token mà Firebase nhận từ APNs. Nếu token APNs thay đổi (ví dụ: sau khi khôi phục thiết bị), Firebase tự động chuyển đăng ký sang token mới. Tuy nhiên, trong một số trường hợp hiếm, có thể cần đăng ký lại sau khi cập nhật Registration Token.
Quản lý từ máy chủ đăng ký cho phép đăng ký và hủy đăng ký thiết bị mà không cần can thiệp ứng dụng khách. Điều này hữu ích cho quản trị, thử nghiệm A/B và quản lý đăng ký ở phía backend.
Firebase cung cấp REST API để quản lý đăng ký hàng loạt. Điểm cuối /v1/projects/{project_id}/subscriptions cho phép đăng ký tối đa 1000 thiết bị trong một yêu cầu. API sử dụng Registration Token của thiết bị để nhận dạng.
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("Lỗi đăng ký", error)
}
}
Quản lý đăng ký từ máy chủ được sử dụng trong một số tình huống. Khi người dùng đăng ký, máy chủ tự động đăng ký họ vào các chủ đề cơ bản. Khi tùy chọn thay đổi trên phiên bản web, máy chủ đồng bộ hóa đăng ký trên thiết bị di động. Quản trị viên có thể đăng ký thiết bị thử nghiệm vào các chủ đề nội bộ để gỡ lỗi. Đối với các thao tác hàng loạt, FCM cung cấp phương thức Instance Group, cho phép quản lý đăng ký của một nhóm thiết bị thông qua một mã định danh nhóm duy nhất.
Firebase không cung cấp API tích hợp để kiểm tra đăng ký hiện tại của thiết bị. Các nhà phát triển nên duy trì cơ sở dữ liệu đăng ký riêng ở phía máy chủ. Mỗi lần khởi chạy ứng dụng, máy khách đồng bộ hóa đăng ký của mình với máy chủ bằng cách gửi danh sách chủ đề đang hoạt động. Điều này giúp xác định sự mất đồng bộ và khôi phục đăng ký nếu cần. Để kiểm toán, hãy sử dụng nhật ký Firebase Cloud Functions — mỗi thao tác đăng ký/hủy đăng ký có thể được ghi lại.
Câu hỏi thường gặp
Số lượng chủ đề tối đa là 2000 trên mỗi ứng dụng. Nếu cần nhiều hơn, hãy cân nhắc sử dụng Nhóm thiết bị hoặc gửi riêng lẻ theo token.
Firebase không cung cấp API trực tiếp để lấy danh sách đăng ký của thiết bị. Các nhà phát triển nên lưu trữ trạng thái đăng ký trên máy chủ riêng của họ và đồng bộ hóa với máy khách.
FCM trả về kết quả thành công. Firebase xử lý việc hủy đăng ký chủ đề không tồn tại như một thao tác no-op — không có lỗi nào được tạo ra, trạng thái không thay đổi.
Có, trong bảng điều khiển Firebase, phần Cloud Messaging, bạn có thể chọn một chủ đề làm đối tượng mục tiêu và gửi thông báo thử nghiệm hoặc sản xuất qua giao diện web.
Thông thường, đăng ký có hiệu lực trong vòng vài giây. Tuy nhiên, trong một số trường hợp hiếm, độ trễ có thể lên tới 30–60 giây do sự lan truyền qua các máy chủ FCM.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm