أفضل الممارسات لإدارة الرموز المميّزة للتسجيل في خدمة "المراسلة عبر السحابة الإلكترونية من Firebase"

إذا كنت تستخدم واجهات برمجة تطبيقات "المراسلة عبر السحابة الإلكترونية من Firebase" لإنشاء طلبات الإرسال آليًا، يمكنك اكتشاف أنك بمرور الوقت تُهدر موارد من خلال إرسال رسائل إلى للأجهزة ذات رموز التسجيل القديمة. يمكن أن يؤثر هذا الموقف على الرسالة بيانات التسليم التي تم الإبلاغ عنها في "وحدة تحكُّم Firebase" أو البيانات التي تم تصديرها إلى BigQuery يظهر كانخفاض كبير (ولكن ليس صالحًا في الواقع) في معدلات العرض. هذا النمط بعض الإجراءات التي يمكنك اتخاذها للمساعدة في ضمان فعالية الاستهداف وإعداد تقارير عرض صالحة.

الرموز المميّزة للتسجيل القديمة والمنتهية الصلاحية

رموز التسجيل القديمة هي رموز مميزة مرتبطة بالأجهزة غير النشطة التي لم يتم الاتصال بخدمة "المراسلة عبر السحابة الإلكترونية من Firebase" لأكثر من شهر بمرور الوقت، يصبح أقل ويقل احتمال اتصال الجهاز بميزة "المراسلة عبر السحابة الإلكترونية من Firebase" مرة أخرى. إرسال رسالة ويتم إرسال عمليات توزيع للمواضيع لهذه الرموز المميزة القديمة تسليمه.

هناك العديد من الأسباب التي قد تجعل الرمز المميز قديمًا. على سبيل المثال، قد يستخدم الجهاز قد يتم فقدان الرمز المميز المرتبط به أو تلفه أو وضعه في التخزين منسي.

عندما تصل الرموز المميّزة القديمة إلى 270 يومًا من عدم النشاط، ستأخذها خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" في الاعتبار الرموز المميّزة منتهية الصلاحية. بعد انتهاء صلاحية رمز مميّز، تضعه خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" علامة عليه كرمز غير صالح ويرفضه يرسل إليها. ومع ذلك، تُصدِر خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" رمزًا مميزًا جديدًا للتطبيق وهو ما يحدث وهو حالات نادرة عندما يتصل الجهاز مرة أخرى ويتم فتح التطبيق.

أفضل الممارسات الأساسية

هناك بعض الممارسات الأساسية التي يجب اتباعها في أي تطبيق يستخدم واجهات برمجة تطبيقات "المراسلة عبر السحابة الإلكترونية من Firebase" لإنشاء طلبات الإرسال آليًا. الأفضل الرئيسي الممارسات هي:

  • يمكنك استرداد رموز التسجيل المميَّزة من خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" وتخزينها على الخادم. أحد الأدوار المهمة للخادم هو تتبع ملفات واحتفظ بقائمة محدثة من الرموز المميزة النشطة. ننصحك بشدة وإضافة طابع زمني للرمز المميز في التعليمات البرمجية والخوادم، وتحديث هذا الطابع الزمني على فترات منتظمة.
  • الحفاظ على حداثة الرموز المميّزة وإزالة الرموز المميّزة القديمة: بالإضافة إلى إزالة الرموز التي لم تعُد تعتبرها خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" صالحة، قد تحتاج لرصد العلامات الأخرى التي تدلّ على أنّ الرموز المميّزة قديمة وإزالتها بشكل استباقي. يناقش هذا الدليل بعض الخيارات المتاحة لك لتحقيق ذلك.

استرداد الرموز المميّزة للتسجيل وتخزينها

عند بدء تشغيل التطبيق للمرة الأولى، تُنشئ حزمة تطوير البرامج (SDK) لخدمة "المراسلة عبر السحابة الإلكترونية من Firebase" تسجيلاً. لمثيل تطبيق العميل. هذا هو الرمز المميز الذي يجب عليك تضمينه استهداف إرسال طلبات من واجهة برمجة التطبيقات، أو إضافة اشتراكات إلى مواضيع لاستهدافها الموضوعات.

ننصحك بشدة باسترداد هذا الرمز المميّز عند بدء تشغيل الجهاز للمرة الأولى وحفظه. إلى خادم التطبيق إلى جانب طابع زمني. يجب أن يكون هذا الطابع الزمني بواسطة الرمز البرمجي وخوادمك، نظرًا لعدم توفيرها لك بواسطة حِزم تطوير البرامج (SDK) لخدمة "المراسلة عبر السحابة الإلكترونية من Firebase".

ومن المهم أيضًا حفظ الرمز المميّز على الخادم وتعديل الطابع الزمني. كلما طرأ تغيير، على سبيل المثال عندما:

  • تتم استعادة التطبيق على جهاز جديد.
  • يلغي المستخدم تثبيت التطبيق أو يعيد تثبيته
  • يمحو المستخدم بيانات التطبيق.
  • يصبح التطبيق نشطًا مرة أخرى بعد انتهاء صلاحية التطبيق الحالي في خدمة "المراسلة عبر السحابة الإلكترونية من Firebase". رمز مميز

مثال: الرموز المميّزة للمتجر والطوابع الزمنية في 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()
            }
        }

الحفاظ على حداثة الرموز المميّزة وإزالة الرموز المميّزة القديمة

تحديد ما إذا كان الرمز المميّز جديدًا أو قديمًا ليس واضحًا دائمًا. إلى أن تغطي جميع الحالات، وعليك وضع حدّ أدنى للقيم التي يجب استيفاؤها قديمة. بشكل تلقائي، تعتبر خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" الرمز المميّز قديمًا إذا كان التطبيق المثيل لم يتم الاتصال بها لمدة شهر. من المرجّح أن يكون أي رمز مميّز مرّ عليه أكثر من شهر أن تكون جهازًا غير نشط قام الجهاز النشط بتحديث الرمز المميز.

بناءً على حالة الاستخدام، قد يكون أحد الأشهر قصيرًا جدًا أو طويلاً جدًا، لذلك ينتهي لك لتحديد المعايير التي تناسبك.

اكتشاف الاستجابات للرموز المميّزة غير الصالحة من واجهة "المراسلة عبر السحابة الإلكترونية من Firebase" الخلفية

تأكَّد من رصد استجابات الرموز المميّزة غير الصالحة من خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" والردّ عليها بحلول حذف أي رموز مميزة للتسجيل معروف أنها غير صالحة من نظامك أو انتهت صلاحيتها. مع واجهة برمجة التطبيقات 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()
        }
    });

لن تعرض خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" استجابة رمز مميّز غير صالح إلا في حال انتهاء صلاحية رمز مميّز. بعد 270 يومًا أو إذا كان العميل غير مسجَّل صراحةً. إذا كنت بحاجة إلى المزيد تتبع القِدم بدقة وفقًا لتعريفاتك، فيمكنك بشكل استباقي إزالة الرموز المميّزة للتسجيل القديمة.

تعديل الرموز المميّزة بشكل منتظم

ننصحك باسترداد جميع الرموز المميّزة للتسجيل وتعديلها بشكل دوري. على خادمك. ويتطلّب ذلك منك ما يلي:

  • أضِف منطق التطبيق إلى تطبيق العميل لاسترداد الرمز المميّز الحالي باستخدام طلب بيانات مناسب من واجهة برمجة التطبيقات (مثل token(completion): لمنصات Apple أو getToken() لنظام التشغيل Android) ثم أرسِل الرمز المميّز الحالي إلى خادم التطبيق لتخزينه (مع طابع زمني). قد تكون هذه وظيفة شهرية مهيأة لتغطية جميع العملاء أو الرموز المميزة.
  • أضِف منطقًا للخادم لتعديل الطابع الزمني للرمز المميّز على فترات زمنية منتظمة. بغض النظر عما إذا كان الرمز المميز قد تغير أم لا.

للحصول على مثال لمنطق Android لتحديث الرموز المميزة باستخدام WorkManager، الرؤية إدارة الرموز المميّزة لخدمة "المراسلة عبر السحابة الإلكترونية" على مدونة Firebase.

مهما كان نمط التوقيت الذي تتبعه، تأكد من تحديث الرموز المميزة بشكل دوري. إنّ يؤدي تكرار التحديث مرة واحدة في الشهر إلى تحقيق توازن جيد بين تأثير البطارية واكتشاف رموز التسجيل غير النشطة. من خلال إجراء هذا التحديث، يمكنك أيضًا والتأكد من أن أي جهاز غير نشط سيعيد تحميل تسجيله عند نشطًا مرة أخرى. ما مِن فائدة من إجراء إعادة التحميل بوتيرة أعلى. مقارنةً أسبوعيًا

إزالة الرموز المميّزة للتسجيل القديمة

قبل إرسال رسائل إلى أي جهاز، يُرجى التأكد من أنّ الطابع الزمني وأن يكون الرمز المميز للتسجيل ضمن فترة انتهاء الصلاحية. على سبيل المثال، تنفيذ وظائف السحابة الإلكترونية لبرنامج 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(); });
});

إلغاء الاشتراك في الرموز المميّزة القديمة من المواضيع

إذا كنت تستخدم مواضيع، قد تحتاج أيضًا إلى إلغاء تسجيل الرموز المميّزة القديمة من المواضيع الذي اشتركوا فيه يتضمن ذلك خطوتين:

  1. يجب أن يعيد تطبيقك الاشتراك في المواضيع مرّة واحدة في الشهر وكلما التغييرات على الرمز المميز للتسجيل. وهذا يشكل حلاً للشفاء الذاتي، حيث تظهر الاشتراكات تلقائيًا عندما يصبح التطبيق نشطًا مرة أخرى.
  2. في حال ظلّ مثيل التطبيق خاملاً لمدة شهر واحد (أو فترة قِدم البيانات الخاصة بك)، يمكنك أن يلغي الاشتراك في المواضيع باستخدام SDK لمشرف Firebase من أجل حذف الرمز المميّز لتعيين المواضيع من الواجهة الخلفية للمراسلة عبر السحابة الإلكترونية من Firebase.

تتمثل فائدة هاتين الخطوتين في حدوث عمليات التوزيع بشكل أسرع نظرًا فهناك عدد أقل من الرموز المميزة القديمة التي سيتم توزيعها، وستظهر إعادة الاشتراك تلقائيًا بعد تنشيطها مرة أخرى.

قياس نجاح التسليم

للحصول على أدق صورة عن تسليم الرسالة، من الأفضل إرسال رسائل إلى مثيلات التطبيقات المستخدمة بشكل نشط. يعد ذلك مهمًا بشكل خاص إذا كنت إرسال رسائل بانتظام إلى مواضيع ذات أعداد كبيرة من المشتركين إذا كانت من هؤلاء المشتركين غير نشطين، ما قد يؤثر في عرض الإعلانات يمكن أن تكون الإحصاءات مهمة بمرور الوقت.

قبل استهداف الرسائل برمز مميّز، ضَع في اعتبارك ما يلي:

لمزيد من المعلومات عن التسليم، يُرجى الاطّلاع على فهم تسليم الرسائل: