Registration Token là mã định danh thiết bị duy nhất mà Firebase Cloud Messaging (FCM) sử dụng để gửi thông báo push. Mỗi ứng dụng trên mỗi thiết bị nhận token riêng của nó, nếu không có token thì việc gửi thông báo là không thể. Theo Firebase, 2025, Registration Token được tạo tự động khi ứng dụng khởi chạy lần đầu và có thể thay đổi trong những điều kiện nhất định.
Những điểm chính
Registration Token là một chuỗi duy nhất dài tới 4096 ký tự mà Firebase Cloud Messaging gán cho mỗi phiên bản ứng dụng. Token được hình thành dựa trên ID ứng dụng, ID thiết bị và tài khoản Google trên thiết bị.
Registration Token bao gồm một chuỗi ký tự ngẫu nhiên được mã hóa ở định dạng Base64. FCM sử dụng token này như một địa chỉ gửi — máy chủ gửi thông báo đến token và FCM định tuyến nó đến thiết bị cụ thể. Không có token, không thể gửi thông báo push đến một người dùng cụ thể.
Registration Token không nên nhầm lẫn với Device ID (IMEI) hoặc Advertising ID. Device ID là định danh phần cứng của thiết bị, trong khi Advertising ID được sử dụng cho mục đích quảng cáo. Registration Token gắn liền với tổ hợp ứng dụng và thiết bị, và một thiết bị có thể có nhiều token cho các ứng dụng khác nhau.
| Định danh | Mục đích | Tính thay đổi |
|---|---|---|
| Registration Token | Gửi thông báo push FCM | Có thể thay đổi |
| Device ID (IMEI) | Định danh phần cứng | Vĩnh viễn |
| Advertising ID | Quảng cáo nhắm mục tiêu | Có thể đặt lại |
| Instance ID | Cơ chế Firebase cũ | Thay đổi khi xóa |
FCM có thể coi Registration Token là không hợp lệ trong một số trường hợp. Nếu ứng dụng bị xóa khỏi thiết bị, token sẽ tự động bị thu hồi. Khi khôi phục dữ liệu từ bản sao lưu trên thiết bị mới, token cũ sẽ ngừng hoạt động. Firebase cũng trả về trạng thái UNREGISTERED khi cố gắng gửi thông báo đến token đã lỗi thời.
Firebase Cloud Messaging tạo Registration Token khi ứng dụng được khởi chạy lần đầu và phương thức getToken() được gọi. Quá trình này bao gồm việc xác minh thông tin đăng nhập Google Play Services và đăng ký ứng dụng trong cơ sở hạ tầng Firebase.
Khi thiết bị chạy ứng dụng có tích hợp FCM SDK lần đầu tiên, những điều sau sẽ xảy ra. Firebase SDK kiểm tra sự hiện diện của Google Play Services trên thiết bị. Sau đó, SDK gửi yêu cầu đến máy chủ Firebase, truyền ID ứng dụng và thông tin thiết bị. Máy chủ Firebase tạo token mới và trả về cho ứng dụng.
FCM sử dụng kiến trúc dựa trên các kết nối dài hạn. Sau khi nhận được Registration Token, thiết bị thiết lập kết nối liên tục với máy chủ Firebase qua giao thức STOMP trên Android hoặc kênh APNs trên iOS. Khi máy chủ gửi thông báo đến token, FCM tìm thiết bị theo token và gửi tải trọng.
Registration Token có thể được FCM tạo lại trong các trường hợp sau. Khi khôi phục ứng dụng từ bản sao lưu trên thiết bị mới. Khi xóa và cài đặt lại ứng dụng. Khi xóa dữ liệu ứng dụng qua cài đặt hệ thống. Khi đăng nhập vào tài khoản Google khác trên thiết bị. Firebase khuyến nghị luôn xử lý callback onNewToken để theo dõi các thay đổi.
Trên Android, Registration Token được lấy qua Firebase Messaging SDK. Quy trình khác nhau tùy theo phiên bản SDK — các phiên bản mới hơn sử dụng API FirebaseInstallations thay vì FirebaseInstanceId cũ.
Bắt đầu từ phiên bản 21.0.0 của Firebase SDK, phương thức getToken() được gọi qua FirebaseMessaging. Cách tiếp cận này tự động quản lý vòng đời token và đăng ký nhận các bản cập nhật của nó.
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onNewToken(token: String) {
sendRegistrationToServer(token)
}
private fun sendRegistrationToServer(token: String) {
// Gửi token đến máy chủ
Log.d("FCM", "New token: $token")
}
init {
FirebaseMessaging.getInstance()
.getToken()
.addOnCompleteListener { task ->
if (!task.isSuccessful) {
Log.w("FCM", "Lấy token FCM thất bại")
return@addOnCompleteListener
}
val token = task.result
sendRegistrationToServer(token)
}
}
}
Trong một số trường hợp, token không cần trong dịch vụ mà cần trực tiếp trong Activity hoặc ViewModel. Để làm điều này, có thể gọi getToken() tại một điểm thích hợp trong vòng đời ứng dụng. Điều quan trọng là không gọi phương thức này từ luồng chính mà không xử lý bất đồng bộ.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
getFCMToken()
}
private fun getFCMToken() {
FirebaseMessaging.getInstance().getToken()
.addOnCompleteListener { task ->
if (task.isSuccessful) {
val token = task.result
Log.d("FCM", "Token: $token")
}
}
}
}
Trong các phiên bản cũ hơn của Firebase SDK (trước phiên bản 20.x), token được lấy qua FirebaseInstanceId.getInstance().getToken(). Phương thức này đã bị đánh dấu là không được dùng nữa và không được khuyến nghị sử dụng trong các dự án mới. Các nhà phát triển duy trì mã cũ nên chuyển sang API FirebaseInstallations.
Trên iOS, quy trình lấy Registration Token khác về mặt kiến trúc — FCM hoạt động qua Apple Push Notification service (APNs). Firebase SDK nhận token thiết bị duy nhất từ APNs, chuyển đổi nó sang định dạng FCM và chuyển cho ứng dụng.
Để sử dụng FCM trên iOS, cần cấu hình chứng chỉ hoặc khóa APNs trong bảng điều khiển Firebase. Ứng dụng phải yêu cầu quyền thông báo qua UNUserNotificationCenter. Sau khi nhận được token APNs, Firebase SDK tự động tạo Registration Token.
import FirebaseMessaging
import UserNotifications
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
application: UIApplication,
didFinishLaunchingWithOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FirebaseApp.configure()
Messaging.messaging().delegate = self
requestNotificationAuthorization()
return true
}
private func requestNotificationAuthorization() {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge])
}
}
extension AppDelegate: MessagingDelegate {
func messaging(
messaging: Messaging,
didReceiveRegistrationToken fcmToken: String?
) {
Log.d("FCM", "Token: \(fcmToken ?? "")")
sendTokenToServer(token: fcmToken)
}
}
Registration Token trên iOS có kích thước nhỏ hơn so với token Android vì nó dựa trên token thiết bị APNs. Firebase SDK tự động cập nhật token FCM khi token APNs thay đổi, điều này xảy ra khi khôi phục thiết bị từ bản sao lưu hoặc cài đặt lại ứng dụng.
Quản lý vòng đời của Registration Token là một nhiệm vụ quan trọng để gửi thông báo push đáng tin cậy. Nếu máy chủ lưu trữ token lỗi thời, thông báo sẽ không được gửi và Firebase sẽ trả về lỗi UNREGISTERED.
Firebase SDK cung cấp hai cơ chế để theo dõi thay đổi token. Trên Android, callback onNewToken trong FirebaseMessagingService được sử dụng. Trên iOS, delegate messaging:didReceiveRegistrationToken được sử dụng. Cả hai đều được gọi mỗi khi token được cập nhật.
// Lưu token vào SharedPreferences và gửi đến máy chủ
class TokenManager(private val context: Context) {
companion object {
private const val PREFS_TOKEN_KEY = "fcm_registration_token"
}
fun saveToken(token: String) {
val prefs = PreferenceManager
.getDefaultSharedPreferences(context)
prefs.edit().putString(PREFS_TOKEN_KEY, token).apply()
}
fun getSavedToken(): String? {
val prefs = PreferenceManager
.getDefaultSharedPreferences(context)
return prefs.getString(PREFS_TOKEN_KEY, null)
}
}
Máy chủ phải lưu trữ Registration Token liên kết với định danh người dùng. Khi token được cập nhật, máy khách gửi token mới đến máy chủ và máy chủ thay thế token cũ. Nên giữ lịch sử token: nếu thông báo không được gửi đến token mới, có thể thử token cũ.
Firebase có thể trả về lỗi lấy token trong một số trường hợp. Thiếu Google Play Services trên thiết bị — token sẽ không được lấy. Vượt quá hạn mức yêu cầu đến FCM — cần triển khai backoff lũy thừa khi thử lại. Hết hạn token — SDK tự động yêu cầu token mới.
| Tình huống | Kết quả | Hành động của nhà phát triển |
|---|---|---|
| Xóa ứng dụng | Token bị thu hồi | Xóa token khỏi cơ sở dữ liệu |
| Khôi phục từ bản sao lưu | Token mới | Cập nhật trong cơ sở dữ liệu |
| Đặt lại Google Play Services | Token được tạo lại | Xử lý onNewToken |
| Hết hạn token | Cập nhật tự động | Đăng ký nhận cập nhật |
Câu hỏi thường gặp
Kiểm tra sự hiện diện của Google Play Services trên thiết bị, tính chính xác của tệp google-services.json và phiên bản Firebase SDK. Đảm bảo ứng dụng có quyền truy cập internet.
Token có thể thay đổi khi gỡ cài đặt và cài đặt lại ứng dụng, xóa dữ liệu, khôi phục từ bản sao lưu hoặc đăng nhập vào tài khoản Google khác. Không có khoảng thời gian cố định.
Có, mỗi ứng dụng trên thiết bị nhận token FCM riêng. Nếu một thiết bị có ba ứng dụng với Firebase, mỗi ứng dụng sẽ có Registration Token duy nhất riêng.
Gửi thông báo thử nghiệm qua bảng điều khiển Firebase hoặc API HTTP FCM. Nếu token không hợp lệ, API sẽ trả về lỗi UNREGISTERED hoặc NOT_FOUND.
Registration Token không phải là khóa bí mật, nhưng việc rò rỉ nó cho phép gửi thông báo đến thiết bị của người dùng. Lưu trữ token trong cơ sở dữ liệu an toàn và sử dụng HTTPS để truyền tải.
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