في حال استخدام واجهات برمجة تطبيقات FCM لإنشاء طلبات الإرسال بشكل آلي، يمكنك: اكتشاف أنك بمرور الوقت تُهدر موارد من خلال إرسال رسائل إلى للأجهزة ذات رموز التسجيل القديمة. يمكن أن يؤثر هذا الموقف على الرسالة بيانات التسليم التي تم الإبلاغ عنها في "وحدة تحكُّم Firebase" أو البيانات التي تم تصديرها إلى BigQuery يظهر كانخفاض كبير (ولكن ليس صالحًا في الواقع) في معدلات العرض. هذا النمط بعض الإجراءات التي يمكنك اتخاذها للمساعدة في ضمان فعالية الاستهداف وإعداد تقارير عرض صالحة.
الرموز المميّزة للتسجيل القديمة والمنتهية الصلاحية
رموز التسجيل القديمة هي رموز مميزة مرتبطة بالأجهزة غير النشطة التي لم يتم الاتصال بـ FCM لأكثر من شهر. بمرور الوقت، يصبح أقل ويقل احتمال اتصال الجهاز بـ FCM مرة أخرى. إرسال رسالة ويتم إرسال عمليات توزيع للمواضيع لهذه الرموز المميزة القديمة تسليمه.
هناك العديد من الأسباب التي قد تجعل الرمز المميز قديمًا. على سبيل المثال، قد يستخدم الجهاز قد يتم فقدان الرمز المميز المرتبط به أو تلفه أو وضعه في التخزين منسي.
عندما تصل الرموز المميّزة القديمة إلى 270 يومًا من عدم النشاط، سيتم النظر إليها من قِبل FCM الرموز المميّزة المنتهية الصلاحية. بعد انتهاء صلاحية رمز مميّز، يضع FCM علامة عليه على أنّه غير صالح ويرفضه يرسل إليها. ومع ذلك، يُصدر FCM رمزًا مميزًا جديدًا للتطبيق. وهو ما يحدث وهو حالات نادرة عندما يتصل الجهاز مرة أخرى ويتم فتح التطبيق.
أفضل الممارسات الأساسية
هناك بعض الممارسات الأساسية التي يجب اتباعها في أي تطبيق يستخدم واجهات برمجة تطبيقات FCM لإنشاء طلبات الإرسال بشكل آلي. الأفضل الرئيسي الممارسات هي:
- يمكنك استرداد رموز التسجيل المميّزة من FCM وتخزينها على أحد الأدوار المهمة للخادم هو تتبع ملفات واحتفظ بقائمة محدثة من الرموز المميزة النشطة. ننصحك بشدة وإضافة طابع زمني للرمز المميز في التعليمات البرمجية والخوادم، وتحديث هذا الطابع الزمني على فترات منتظمة.
- الحفاظ على حداثة الرموز المميّزة وإزالة الرموز المميّزة القديمة: بالإضافة إلى إزالة الرموز المميزة التي لم تعد تعتبرها FCM صالحة، يمكنك لرصد العلامات الأخرى التي تدلّ على أنّ الرموز المميّزة قديمة وإزالتها بشكل استباقي. يناقش هذا الدليل بعض الخيارات المتاحة لك لتحقيق ذلك.
استرداد الرموز المميّزة للتسجيل وتخزينها
عند بدء تشغيل تطبيقك للمرة الأولى، تُنشئ حزمة تطوير البرامج (SDK) "FCM" تسجيلاً. لمثيل تطبيق العميل. هذا هو الرمز المميز الذي يجب عليك تضمينه استهداف إرسال طلبات من واجهة برمجة التطبيقات، أو إضافة اشتراكات إلى مواضيع لاستهدافها الموضوعات.
ننصحك بشدة باسترداد هذا الرمز المميّز عند بدء تشغيل الجهاز للمرة الأولى وحفظه. إلى خادم التطبيق إلى جانب طابع زمني. يجب أن يكون هذا الطابع الزمني بواسطة الرمز البرمجي وخوادمك، نظرًا لعدم توفيرها لك بواسطة FCM حزمة SDK
ومن المهم أيضًا حفظ الرمز المميّز على الخادم وتعديل الطابع الزمني. كلما طرأ تغيير، على سبيل المثال عندما:
- تتم استعادة التطبيق على جهاز جديد.
- يلغي المستخدم تثبيت التطبيق أو يعيد تثبيته
- يمحو المستخدم بيانات التطبيق.
- يصبح التطبيق نشطًا مرة أخرى بعد انتهاء صلاحية FCM الحالي. رمز مميز
مثال: الرموز المميّزة للمتجر والطوابع الزمنية باللغة Cloud Firestore
على سبيل المثال، يمكنك استخدام Cloud Firestore لتخزين الرموز المميّزة في مجموعة.
يسمى fcmTokens
. يتجاوب كل معرف مستند في المجموعة مع
معرف مستخدم، ويخزن المستند الرمز المميز للتسجيل الحالي
الطابع الزمني لآخر تعديل استخدم الدالة set
كما هو موضح في مثال Kotlin هذا:
/**
* Persist token to third-party servers.
*
* Modify this method to associate the user's FCM registration token with any server-side account
* maintained by your application.
*
* @param token The new token.
*/
private fun sendTokenToServer(token: String?) {
// If you're running your own server, call API to send token and today's date for the user
// Example shown below with Firestore
// Add token and timestamp to Firestore for this user
val deviceToken = hashMapOf(
"token" to token,
"timestamp" to FieldValue.serverTimestamp(),
)
// Get user ID from Firebase Auth or your own server
Firebase.firestore.collection("fcmTokens").document("myuserid")
.set(deviceToken)
}
عند استرداد رمز مميّز، يتم تخزينه في "Cloud Firestore" من خلال الاتصال
sendTokenToServer
:
/**
* Called if the FCM registration token is updated. This may occur if the security of
* the previous token had been compromised. Note that this is called when the
* FCM registration token is initially generated so this is where you would retrieve the token.
*/
override fun onNewToken(token: String) {
Log.d(TAG, "Refreshed token: $token")
// If you want to send messages to this application instance or
// manage this apps subscriptions on the server side, send the
// FCM registration token to your app server.
sendTokenToServer(token)
}
var token = Firebase.messaging.token.await()
// Check whether the retrieved token matches the one on your server for this user's device
val preferences = this.getPreferences(Context.MODE_PRIVATE)
val tokenStored = preferences.getString("deviceToken", "")
lifecycleScope.launch {
if (tokenStored == "" || tokenStored != token)
{
// If you have your own server, call API to send the above token and Date() for this user's device
// Example shown below with Firestore
// Add token and timestamp to Firestore for this user
val deviceToken = hashMapOf(
"token" to token,
"timestamp" to FieldValue.serverTimestamp(),
)
// Get user ID from Firebase Auth or your own server
Firebase.firestore.collection("fcmTokens").document("myuserid")
.set(deviceToken).await()
}
}
الحفاظ على حداثة الرموز المميّزة وإزالة الرموز المميّزة القديمة
تحديد ما إذا كان الرمز المميّز جديدًا أو قديمًا ليس واضحًا دائمًا. إلى أن تغطي جميع الحالات، وعليك وضع حدّ أدنى للقيم التي يجب استيفاؤها قديمة. بشكل تلقائي، تعتبر FCM أنّ الرمز المميّز قديم إذا كان التطبيق المثيل لم يتم الاتصال بها لمدة شهر. من المرجّح أن يكون أي رمز مميّز مرّ عليه أكثر من شهر أن تكون جهازًا غير نشط قام الجهاز النشط بتحديث الرمز المميز.
بناءً على حالة الاستخدام، قد يكون أحد الأشهر قصيرًا جدًا أو طويلاً جدًا، لذلك ينتهي لك لتحديد المعايير التي تناسبك.
رصد الاستجابات للرموز المميّزة غير الصالحة من واجهة FCM الخلفية
احرص على رصد استجابات الرموز المميّزة غير الصالحة من FCM والردّ عليها بحلول حذف أي رموز مميزة للتسجيل معروف أنها غير صالحة من نظامك أو انتهت صلاحيتها. مع واجهة برمجة التطبيقات HTTP v1 API، قد تشير رسائل الخطأ هذه إلى أن استهدف طلب الإرسال رموزًا مميزة غير صالحة أو منتهية الصلاحية:
UNREGISTERED
(HTTP 404)INVALID_ARGUMENT
(HTTP 400)
إذا كنت متأكدًا من أن حمولة الرسالة صالحة وستتلقى أيًا هذه الاستجابات لرمز مميز مستهدف، يمكنك حذف سجل هذا ، حيث إنه لن يكون صالحًا أبدًا مرة أخرى. على سبيل المثال، لحذف الرموز المميّزة غير الصالحة من Cloud Firestore، يمكنك نشر دالة وتشغيلها كما يلي:
// Registration token comes from the client FCM SDKs
const registrationToken = 'YOUR_REGISTRATION_TOKEN';
const message = {
data: {
// Information you want to send inside of notification
},
token: registrationToken
};
// Send message to device with provided registration token
getMessaging().send(message)
.then((response) => {
// Response is a message ID string.
})
.catch((error) => {
// Delete token for user if error code is UNREGISTERED or INVALID_ARGUMENT.
if (errorCode == "messaging/registration-token-not-registered") {
// If you're running your own server, call API to delete the
token for the user
// Example shown below with Firestore
// Get user ID from Firebase Auth or your own server
Firebase.firestore.collection("fcmTokens").document(user.uid).delete()
}
});
لن يعرض FCM استجابة رمز مميّز غير صالح إلا في حال انتهاء صلاحية رمز مميّز. بعد 270 يومًا أو إذا كان العميل غير مسجَّل صراحةً. إذا كنت بحاجة إلى المزيد تتبع القِدم بدقة وفقًا لتعريفاتك، فيمكنك بشكل استباقي إزالة الرموز المميّزة للتسجيل القديمة.
تعديل الرموز المميّزة بشكل منتظم
ننصحك باسترداد جميع الرموز المميّزة للتسجيل وتعديلها بشكل دوري. على خادمك. ويتطلّب ذلك منك ما يلي:
- أضِف منطق التطبيق إلى تطبيق العميل لاسترداد الرمز المميّز الحالي باستخدام
طلب بيانات مناسب من واجهة برمجة التطبيقات (مثل
token(completion):
لمنصات Apple أوgetToken()
لنظام التشغيل Android) ثم أرسِل الرمز المميّز الحالي إلى خادم التطبيق لتخزينه (مع طابع زمني). قد تكون هذه وظيفة شهرية مهيأة لتغطية جميع العملاء أو الرموز المميزة. - أضِف منطقًا للخادم لتعديل الطابع الزمني للرمز المميّز على فترات زمنية منتظمة. بغض النظر عما إذا كان الرمز المميز قد تغير أم لا.
للحصول على مثال لمنطق Android لتحديث الرموز المميزة باستخدام WorkManager، الرؤية إدارة الرموز المميّزة لخدمة "المراسلة عبر السحابة الإلكترونية" على مدونة Firebase.
مهما كان نمط التوقيت الذي تتبعه، تأكد من تحديث الرموز المميزة بشكل دوري. إنّ يؤدي تكرار التحديث مرة واحدة في الشهر إلى تحقيق توازن جيد بين تأثير البطارية واكتشاف رموز التسجيل غير النشطة. من خلال إجراء هذا التحديث، يمكنك أيضًا والتأكد من أن أي جهاز غير نشط سيعيد تحميل تسجيله عند نشطًا مرة أخرى. ما مِن فائدة من إجراء إعادة التحميل بوتيرة أعلى. مقارنةً أسبوعيًا
إزالة الرموز المميّزة للتسجيل القديمة
قبل إرسال رسائل إلى أي جهاز، يُرجى التأكد من أنّ الطابع الزمني
الرمز المميز للتسجيل ضمن فترة انتهاء تلف البيانات. على سبيل المثال،
تنفيذ Cloud Functions for Firebase لإجراء فحص يومي لضمان تنفيذ
الطابع الزمني ضمن فترة زمنية محدّدة للانتهاء، مثل const
EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 30;
، ثم أزِل الرموز المميّزة القديمة:
exports.pruneTokens = functions.pubsub.schedule('every 24 hours').onRun(async (context) => {
// Get all documents where the timestamp exceeds is not within the past month
const staleTokensResult = await admin.firestore().collection('fcmTokens')
.where("timestamp", "<", Date.now() - EXPIRATION_TIME)
.get();
// Delete devices with stale tokens
staleTokensResult.forEach(function(doc) { doc.ref.delete(); });
});
إلغاء الاشتراك في الرموز المميّزة القديمة من المواضيع
إذا كنت تستخدم مواضيع، قد تحتاج أيضًا إلى إلغاء تسجيل الرموز المميّزة القديمة من المواضيع الذي اشتركوا فيه يتضمن ذلك خطوتين:
- يجب أن يعيد تطبيقك الاشتراك في المواضيع مرّة واحدة في الشهر وكلما التغييرات على الرمز المميز للتسجيل. وهذا يشكل حلاً للشفاء الذاتي، حيث تظهر الاشتراكات تلقائيًا عندما يصبح التطبيق نشطًا مرة أخرى.
- في حال ظلّ مثيل التطبيق خاملاً لمدة شهر واحد (أو فترة قِدم البيانات الخاصة بك)، يمكنك أن يلغي الاشتراك في المواضيع باستخدام SDK لمشرف Firebase من أجل حذف الرمز المميّز لربط المواضيع من الواجهة الخلفية FCM
تتمثل فائدة هاتين الخطوتين في حدوث عمليات التوزيع بشكل أسرع نظرًا فهناك عدد أقل من الرموز المميزة القديمة التي سيتم توزيعها، وستظهر إعادة الاشتراك تلقائيًا بعد تنشيطها مرة أخرى.
قياس نجاح التسليم
للحصول على أدق صورة عن تسليم الرسالة، من الأفضل إرسال الرسائل إلى مثيلات التطبيقات المستخدَمة بشكل نشط. يعد ذلك مهمًا بشكل خاص إذا كنت إرسال رسائل بانتظام إلى مواضيع ذات أعداد كبيرة من المشتركين إذا كانت من هؤلاء المشتركين غير نشطين، ما قد يؤثر في عرض الإعلانات يمكن أن تكون الإحصاءات مهمة بمرور الوقت.
قبل استهداف الرسائل برمز مميّز، ضَع في اعتبارك ما يلي:
- هل استخدام "إحصاءات Google" أو البيانات التي تم تسجيلها في BigQuery أو إشارات التتبُّع الأخرى إلى أن الرمز المميز نشط؟
- هل فشلت محاولات التسليم السابقة بشكل مستمر على مدار فترة زمنية؟
- هل تم تعديل الرمز المميّز للتسجيل على خوادمك خلال الشهر الماضي؟
- بالنسبة إلى أجهزة Android، هل تُستخدَم واجهة برمجة التطبيقات لبيانات "المراسلة عبر السحابة الإلكترونية من Firebase"
الإبلاغ عن نسبة عالية من إخفاقات تسليم الرسائل بسبب
droppedDeviceInactive
؟
لمزيد من المعلومات عن التسليم، يُرجى الاطّلاع على فهم تسليم الرسائل: