Registration Token هو معرف فريد للجهاز يستخدمه Firebase Cloud Messaging (FCM) لتوصيل إشعارات الدفع. يحصل كل تطبيق على كل جهاز على الرمز المميز الخاص به، والذي بدونه يستحيل إرسال الإشعارات. وفقًا لـ Firebase، 2025، يتم إنشاء Registration Token تلقائيًا عند تشغيل التطبيق لأول مرة وقد يتغير في ظل ظروف معينة.
النقاط الرئيسية
Registration Token هو سلسلة فريدة يصل طولها إلى 4096 حرفًا يعيّنها Firebase Cloud Messaging لكل مثيل تطبيق. يتم تشكيل الرمز بناءً على معرف التطبيق ومعرف الجهاز وحساب Google على الجهاز.
يتكون Registration Token من تسلسل عشوائي من الأحرف المشفرة بتنسيق Base64. يستخدم FCM هذا الرمز كـ عنوان توصيل — يرسل الخادم إشعارًا إلى الرمز، ويقوم FCM بتوجيهه إلى الجهاز المحدد. بدون رمز، من المستحيل توجيه إشعار دفع لمستخدم معين.
لا ينبغي الخلط بين Registration Token و Device ID (IMEI) أو Advertising ID. Device ID هو معرف مادي للجهاز، بينما يستخدم Advertising ID لأغراض إعلانية. يرتبط Registration Token بمزيج التطبيق والجهاز، ويمكن لجهاز واحد أن يحتوي على عدة رموز لتطبيقات مختلفة.
| المعرف | الغرض | القابلية للتغيير |
|---|---|---|
| Registration Token | توصيل إشعارات الدفع 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، ناقلاً معرف التطبيق ومعلومات الجهاز. ينشئ خادم Firebase رمزًا جديدًا ويعيده إلى التطبيق.
يستخدم FCM بنية تعتمد على اتصالات طويلة الأمد. بعد استلام Registration Token، ينشئ الجهاز اتصالاً مستمراً بخوادم Firebase عبر بروتوكول STOMP على أندرويد أو قناة APNs على iOS. عندما يرسل الخادم إشعارًا إلى الرمز، يجد FCM الجهاز بواسطة الرمز ويوصل الحمولة.
قد يتم إعادة إنشاء Registration Token بواسطة FCM في الحالات التالية. عند استعادة تطبيق من نسخة احتياطية على جهاز جديد. عند حذف التطبيق وإعادة تثبيته. عند مسح بيانات التطبيق عبر إعدادات النظام. عند تسجيل الدخول إلى حساب Google مختلف على الجهاز. توصي Firebase دائمًا بمعالجة رد الاتصال onNewToken لتتبع التغييرات.
على أندرويد، يتم الحصول على 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 أصغر مقارنة برمز أندرويد، لأنه يعتمد على رمز جهاز APNs. يقوم Firebase SDK بتحديث رمز FCM تلقائيًا عند تغيير رمز APNs، وهو ما يحدث عند استعادة جهاز من نسخة احتياطية أو إعادة تثبيت التطبيق.
إدارة دورة حياة Registration Token هي مهمة بالغة الأهمية لتوصيل إشعارات الدفع بشكل موثوق. إذا كان الخادم يخزن رمزًا قديمًا، فلن يتم تسليم الإشعارات، وسيعيد Firebase خطأ UNREGISTERED.
يوفر Firebase SDK آليتين لتتبع تغييرات الرمز. على أندرويد، يتم استخدام رد الاتصال onNewToken في FirebaseMessagingService. على iOS، يتم استخدام المفوض 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)
}
}
يجب على الخادم تخزين RegistrationToken مرتبطًا بـ معرف المستخدم. عند تحديث الرمز، يرسل العميل الرمز الجديد إلى الخادم، ويستبدل الخادم القديم. يُوصى بالاحتفاظ بسجل للرموز: إذا لم يتم تسليم إشعار إلى الرمز الجديد، يمكن تجربة القديم.
قد يعيد 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. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا