Registration Token คือตัวระบุอุปกรณ์ที่ไม่ซ้ำกันซึ่ง Firebase Cloud Messaging (FCM) ใช้ในการส่งการแจ้งเตือนแบบ Push แต่ละแอปบนแต่ละอุปกรณ์จะได้รับโทเค็นของตัวเอง โดยที่ไม่สามารถส่งการแจ้งเตือนได้หากไม่มีโทเค็นนี้ ตามข้อมูลจาก Firebase, 2025 Registration Token จะถูกสร้างขึ้นโดยอัตโนมัติเมื่อเปิดแอปครั้งแรกและอาจเปลี่ยนแปลงได้ภายใต้เงื่อนไขบางประการ
ประเด็นสำคัญ
Registration Token คือสตริงที่ไม่ซ้ำกันซึ่งมีความยาวสูงสุด 4096 ตัวอักษรที่ Firebase Cloud Messaging กำหนดให้กับแต่ละอินสแตนซ์ของแอป โทเค็นถูกสร้างขึ้นบนพื้นฐานของ ID แอป ID อุปกรณ์ และบัญชี Google บนอุปกรณ์
Registration Token ประกอบด้วยลำดับตัวอักษรแบบสุ่มที่เข้ารหัสในรูปแบบ Base64 FCM ใช้โทเค็นนี้เป็น ที่อยู่สำหรับจัดส่ง — เซิร์ฟเวอร์ส่งการแจ้งเตือนไปยังโทเค็น และ FCM จะกำหนดเส้นทางไปยังอุปกรณ์เฉพาะ หากไม่มีโทเค็น จะไม่สามารถส่งการแจ้งเตือนแบบ Push ไปยังผู้ใช้เฉพาะได้
ไม่ควรสับสนระหว่าง Registration Token กับ Device ID (IMEI) หรือ Advertising ID Device ID คือตัวระบุฮาร์ดแวร์ของอุปกรณ์ ในขณะที่ Advertising ID ใช้เพื่อวัตถุประสงค์ในการโฆษณา Registration Token เชื่อมโยงกับการรวมกันของแอปและอุปกรณ์ และอุปกรณ์หนึ่งเครื่องสามารถมีหลายโทเค็นสำหรับแอปต่างๆ
| ตัวระบุ | วัตถุประสงค์ | ความสามารถในการเปลี่ยนแปลง |
|---|---|---|
| Registration Token | การส่งการแจ้งเตือนแบบ Push ของ FCM | อาจเปลี่ยนแปลงได้ |
| Device ID (IMEI) | การระบุฮาร์ดแวร์ | ถาวร |
| Advertising ID | โฆษณาแบบกำหนดเป้าหมาย | สามารถรีเซ็ตได้ |
| Instance ID | กลไก Firebase รุ่นเก่า | เปลี่ยนแปลงเมื่อลบ |
FCM อาจถือว่า Registration Token ไม่ถูกต้องในหลายสถานการณ์ หากแอปถูกลบออกจากอุปกรณ์ โทเค็นจะถูกเพิกถอนโดยอัตโนมัติ เมื่อกู้คืนข้อมูลจากการสำรองข้อมูลบนอุปกรณ์ใหม่ โทเค็นเก่าจะหยุดทำงาน นอกจากนี้ Firebase จะส่งคืนสถานะ UNREGISTERED เมื่อพยายามส่งการแจ้งเตือนไปยังโทเค็นที่ล้าสมัย
Firebase Cloud Messaging จะสร้าง Registration Token เมื่อแอปเปิดครั้งแรกและเรียกใช้เมธอด getToken() กระบวนการนี้รวมถึงการตรวจสอบข้อมูลรับรอง Google Play Services และการลงทะเบียนแอปในโครงสร้างพื้นฐานของ Firebase
เมื่ออุปกรณ์เรียกใช้แอปที่มี FCM SDK ในตัวเป็นครั้งแรก จะเกิดสิ่งต่อไปนี้ Firebase SDK ตรวจสอบการมีอยู่ของ Google Play Services บนอุปกรณ์ จากนั้น SDK จะส่งคำขอไปยังเซิร์ฟเวอร์ Firebase โดยส่ง ID แอปและข้อมูลอุปกรณ์ เซิร์ฟเวอร์ Firebase สร้างโทเค็นใหม่และส่งคืนให้กับแอป
FCM ใช้สถาปัตยกรรมที่อิงตามการเชื่อมต่อระยะยาว หลังจากได้รับ Registration Token อุปกรณ์จะสร้างการเชื่อมต่อถาวรกับเซิร์ฟเวอร์ Firebase ผ่าน โปรโตคอล STOMP บน Android หรือ ช่องทาง APNs บน iOS เมื่อเซิร์ฟเวอร์ส่งการแจ้งเตือนไปยังโทเค็น FCM จะค้นหาอุปกรณ์ด้วยโทเค็นและส่งเพย์โหลด
Registration Token อาจถูกสร้างใหม่โดย FCM ในกรณีต่อไปนี้ เมื่อกู้คืนแอปจากการสำรองข้อมูลบนอุปกรณ์ใหม่ เมื่อลบและติดตั้งแอปใหม่ เมื่อล้างข้อมูลแอปผ่านการตั้งค่าระบบ เมื่อเข้าสู่ระบบด้วย บัญชี Google อื่นบนอุปกรณ์ Firebase แนะนำให้จัดการ onNewToken callback เสมอเพื่อติดตามการเปลี่ยนแปลง
บน Android การรับ Registration Token ทำได้ผ่าน Firebase Messaging SDK กระบวนการจะแตกต่างกันไปตามเวอร์ชันของ SDK — เวอร์ชันใหม่ใช้ FirebaseInstallations API แทน FirebaseInstanceId ที่เลิกใช้งานแล้ว
ตั้งแต่ Firebase SDK เวอร์ชัน 21.0.0 เป็นต้นไป เมธอด getToken() จะถูกเรียกผ่าน FirebaseMessaging วิธีการนี้จะจัดการวงจรชีวิตของโทเค็นโดยอัตโนมัติและสมัครรับการอัปเดต
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onNewToken(token: String) {
sendRegistrationToServer(token)
}
private fun sendRegistrationToServer(token: String) {
// ส่งโทเค็นไปยังเซิร์ฟเวอร์
Log.d("FCM", "New token: $token")
}
init {
FirebaseMessaging.getInstance()
.getToken()
.addOnCompleteListener { task ->
if (!task.isSuccessful) {
Log.w("FCM", "การรับโทเค็น FCM ล้มเหลว")
return@addOnCompleteListener
}
val token = task.result
sendRegistrationToServer(token)
}
}
}
ในบางสถานการณ์ โทเค็นจำเป็นต้องใช้ไม่ใช่ในบริการ แต่โดยตรงใน Activity หรือ ViewModel สำหรับสิ่งนี้ สามารถเรียก getToken() ได้ในจุดที่เหมาะสมของวงจรชีวิตของแอป สิ่งสำคัญคือไม่ควรเรียกเมธอดนี้จากเธรดหลักโดยไม่จัดการกับความไม่ประสานเวลา
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")
}
}
}
}
ในเวอร์ชันเก่าของ Firebase SDK (ก่อนเวอร์ชัน 20.x) โทเค็นถูกได้รับผ่าน FirebaseInstanceId.getInstance().getToken() เมธอดนี้ถูกทำเครื่องหมายว่าเลิกใช้งานแล้วและไม่แนะนำให้ใช้ในโปรเจกต์ใหม่ นักพัฒนาที่ดูแลโค้ดรุ่นเก่าควรย้ายไปใช้ FirebaseInstallations API
บน iOS กระบวนการรับ Registration Token แตกต่างกันในเชิงสถาปัตยกรรม — FCM ทำงานผ่าน Apple Push Notification service (APNs) Firebase SDK รับโทเค็นอุปกรณ์ที่ไม่ซ้ำกันจาก APNs แปลงเป็นรูปแบบ FCM และส่งต่อไปยังแอป
ในการใช้ FCM บน iOS จำเป็นต้องกำหนดค่าใบรับรองหรือคีย์ APNs ในคอนโซล Firebase แอปต้องขออนุญาตการแจ้งเตือนผ่าน UNUserNotificationCenter หลังจากได้รับโทเค็น APNs แล้ว Firebase SDK จะสร้าง 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 บน iOS มีขนาดเล็กกว่าเมื่อเทียบกับโทเค็น Android เนื่องจากอิงตาม โทเค็นอุปกรณ์ APNs Firebase SDK จะอัปเดตโทเค็น FCM โดยอัตโนมัติเมื่อโทเค็น APNs เปลี่ยนแปลง ซึ่งเกิดขึ้นเมื่อกู้คืนอุปกรณ์จากการสำรองข้อมูลหรือติดตั้งแอปใหม่
การจัดการวงจรชีวิต ของ Registration Token เป็นงานที่สำคัญอย่างยิ่งสำหรับการส่งการแจ้งเตือนแบบ Push ที่เชื่อถือได้ หากเซิร์ฟเวอร์จัดเก็บโทเค็นที่ล้าสมัย การแจ้งเตือนจะไม่ถูกส่ง และ Firebase จะส่งคืนข้อผิดพลาด UNREGISTERED
Firebase SDK มีกลไกสองอย่างสำหรับติดตามการเปลี่ยนแปลงของโทเค็น บน Android จะใช้ callback onNewToken ใน FirebaseMessagingService บน iOS จะใช้ delegate messaging:didReceiveRegistrationToken ทั้งสองจะถูกเรียกทุกครั้งที่โทเค็นถูกอัปเดต
// บันทึกโทเค็นใน SharedPreferences และส่งไปยังเซิร์ฟเวอร์
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)
}
}
เซิร์ฟเวอร์ต้องจัดเก็บ Registration Token ร่วมกับ ตัวระบุผู้ใช้ เมื่อโทเค็นถูกอัปเดต ไคลเอ็นต์จะส่งโทเค็นใหม่ไปยังเซิร์ฟเวอร์ และเซิร์ฟเวอร์จะแทนที่โทเค็นเก่า ขอแนะนำให้เก็บประวัติโทเค็นไว้: หากการแจ้งเตือนไม่ถูกส่งไปยังโทเค็นใหม่ สามารถลองใช้โทเค็นเก่าได้
Firebase อาจส่งคืนข้อผิดพลาดในการรับโทเค็นในหลายกรณี การไม่มี Google Play Services บนอุปกรณ์ — จะไม่ได้รับโทเค็น การเกินโควต้าคำขอไปยัง FCM — จำเป็นต้องใช้ การหน่วงเวลาแบบเอกซ์โปเนนเชียล เมื่อลองใหม่ การหมดอายุของโทเค็น — SDK จะขอใหม่โดยอัตโนมัติ
| สถานการณ์ | ผลลัพธ์ | การดำเนินการของนักพัฒนา |
|---|---|---|
| การลบแอป | โทเค็นถูกเพิกถอน | ลบโทเค็นออกจากฐานข้อมูล |
| การกู้คืนจากสำรอง | โทเค็นใหม่ | อัปเดตในฐานข้อมูล |
| การรีเซ็ต Google Play Services | สร้างโทเค็นใหม่ | จัดการ onNewToken |
| โทเค็นหมดอายุ | อัปเดตอัตโนมัติ | สมัครรับการอัปเดต |
คำถามที่พบบ่อย
ตรวจสอบการมีอยู่ของ Google Play Services บนอุปกรณ์ ความถูกต้องของไฟล์ google-services.json และเวอร์ชันของ Firebase SDK ตรวจสอบให้แน่ใจว่าแอปมีสิทธิ์เข้าถึงอินเทอร์เน็ต
โทเค็นอาจเปลี่ยนแปลงเมื่อถอนการติดตั้งและติดตั้งแอปใหม่ ล้างข้อมูล กู้คืนจากการสำรองข้อมูล หรือเข้าสู่ระบบด้วย บัญชี Google อื่น ไม่มีช่วงเวลาที่แน่นอน
ได้ แต่ละแอปบนอุปกรณ์จะได้รับโทเค็น FCM ของตัวเอง หากอุปกรณ์มีสามแอปที่ใช้ Firebase แต่ละแอปจะมี Registration Token ที่ไม่ซ้ำกัน ของตัวเอง
ส่งการแจ้งเตือนทดสอบผ่านคอนโซล Firebase หรือ FCM HTTP API หากโทเค็นไม่ถูกต้อง API จะส่งคืนข้อผิดพลาด UNREGISTERED หรือ NOT_FOUND
Registration Token ไม่ใช่คีย์ลับ แต่การรั่วไหลของมันทำให้สามารถส่งการแจ้งเตือนไปยังอุปกรณ์ของผู้ใช้ได้ จัดเก็บโทเค็นใน ฐานข้อมูลที่ปลอดภัย และใช้ HTTPS สำหรับการส่งข้อมูล
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม