بهترین روش ها برای مدیریت رمز ثبت FCM

اگر از API های FCM برای ایجاد درخواست های ارسال به صورت برنامه ای استفاده می کنید، ممکن است متوجه شوید که با گذشت زمان، با ارسال پیام به دستگاه های غیرفعال با نشانه های ثبت نام قدیمی، منابع را هدر می دهید. این وضعیت می‌تواند بر داده‌های تحویل پیام گزارش‌شده در کنسول Firebase یا داده‌های صادر شده به BigQuery تأثیر بگذارد و به‌عنوان کاهش چشمگیر (اما نه در واقع معتبر) در نرخ‌های تحویل نشان داده شود. این راهنما برخی از اقداماتی را که می‌توانید برای اطمینان از هدف‌یابی پیام مؤثر و گزارش تحویل معتبر انجام دهید، مورد بحث قرار می‌دهد.

توکن های ثبت نام قدیمی و منقضی شده

توکن‌های ثبت نام قدیمی، توکن‌هایی هستند که با دستگاه‌های غیرفعال مرتبط هستند که بیش از یک ماه به FCM متصل نشده‌اند. با گذشت زمان، احتمال اینکه دستگاه دوباره به FCM متصل شود کمتر و کمتر می شود. بعید به نظر می‌رسد که پیام‌ها و پیام‌های ارسال موضوع برای این توکن‌های قدیمی تحویل داده شوند.

دلایل مختلفی وجود دارد که چرا یک توکن ممکن است کهنه شود. برای مثال، دستگاهی که توکن با آن مرتبط است ممکن است گم شود، از بین برود، یا در انبار قرار گیرد و فراموش شود.

زمانی که توکن‌های قدیمی به 270 روز عدم فعالیت برسند، FCM آنها را توکن‌های منقضی شده در نظر می‌گیرد. هنگامی که یک توکن منقضی می شود، FCM آن را به عنوان نامعتبر علامت گذاری می کند و ارسال به آن را رد می کند. با این حال، در موارد نادری که دستگاه دوباره وصل شده و برنامه باز می شود، FCM یک توکن جدید برای نمونه برنامه صادر می کند.

بهترین شیوه های اساسی

در هر برنامه‌ای که از APIهای FCM برای ایجاد درخواست‌های ارسال به‌صورت برنامه‌ریزی استفاده می‌کند، باید از چند روش اساسی پیروی کنید. بهترین شیوه های اصلی عبارتند از:

  • توکن های ثبت نام را از FCM بازیابی کنید و در سرور خود ذخیره کنید. نقش مهمی برای سرور این است که توکن هر مشتری را ردیابی کند و فهرستی از توکن های فعال را به روز نگه دارد. ما اکیداً توصیه می‌کنیم یک مهر زمانی رمزی را در کد و سرورهای خود پیاده‌سازی کنید و این مهر زمانی را در فواصل زمانی منظم به‌روزرسانی کنید.
  • طراوت توکن را حفظ کنید و ژتون های کهنه را حذف کنید. علاوه بر حذف توکن‌هایی که FCM دیگر آن‌ها را معتبر نمی‌داند، ممکن است بخواهید سایر نشانه‌هایی که نشان می‌دهند کهنه شده‌اند را زیر نظر داشته باشید و آنها را فعالانه حذف کنید. این راهنما برخی از گزینه های شما را برای دستیابی به این هدف مورد بحث قرار می دهد.

توکن های ثبت نام را بازیابی و ذخیره کنید

در راه اندازی اولیه برنامه شما، FCM SDK یک نشانه ثبت نام برای نمونه برنامه مشتری ایجاد می کند. این نشانه‌ای است که باید در درخواست‌های ارسال هدفمند از API بگنجانید یا اشتراک‌های موضوعی را برای موضوعات هدف‌یابی اضافه کنید.

ما قویاً به برنامه شما توصیه می کنیم که این نشانه را در هنگام راه اندازی اولیه بازیابی کند و آن را در سرور برنامه خود به همراه مهر زمانی ذخیره کند . این مهر زمانی باید توسط کد و سرورهای شما پیاده سازی شود، زیرا توسط 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)
    }

هر زمان که نشانه ای بازیابی می شود، با فراخوانی sendTokenToServer در Cloud Firestore ذخیره می شود:

    /**
     * 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 روز منقضی شده باشد یا اگر مشتری صریحاً ثبت نشده باشد. اگر نیاز به ردیابی دقیق‌تر کهنگی طبق تعاریف خود دارید، می‌توانید به طور فعال توکن‌های ثبت نام قدیمی را حذف کنید .

توکن ها را به طور منظم به روز کنید

توصیه می کنیم به طور دوره ای تمام نشانه های ثبت نام را در سرور خود بازیابی و به روز کنید. این امر مستلزم این است که:

  • منطق برنامه را در برنامه مشتری خود اضافه کنید تا توکن فعلی را با استفاده از تماس API مناسب (مانند token(completion): برای پلتفرم های اپل یا getToken() برای اندروید) بازیابی کنید و سپس رمز فعلی را برای ذخیره سازی به سرور برنامه خود ارسال کنید (با یک مهر زمانی). این می تواند یک کار ماهانه باشد که برای پوشش همه مشتریان یا توکن ها پیکربندی شده است.
  • منطق سرور را اضافه کنید تا مهر زمانی نشانه را در فواصل زمانی منظم به روز کنید، صرف نظر از اینکه آیا توکن تغییر کرده است یا خیر.

برای مثالی از منطق 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(); });
});

لغو اشتراک نشانه های قدیمی از موضوعات

اگر از موضوعات استفاده می کنید، ممکن است بخواهید توکن های قدیمی را از موضوعاتی که در آنها مشترک شده اند لغو ثبت کنید. این شامل دو مرحله است:

  1. برنامه شما باید هر ماه یکبار و هر زمان که نشانه ثبت نام تغییر کرد، مجدداً در موضوعات مشترک شود. این یک راه حل خوددرمانی را تشکیل می دهد، که در آن اشتراک ها به طور خودکار با فعال شدن مجدد یک برنامه دوباره ظاهر می شوند.
  2. اگر یک نمونه برنامه به مدت یک ماه بیکار است (یا پنجره کهنگی خودتان)، باید اشتراک آن را از موضوعاتی که با استفاده از Firebase Admin SDK استفاده می‌کنند لغو کنید تا نگاشت کد به موضوع از باطن FCM حذف شود.

مزیت این دو مرحله این است که فن‌آوت‌های شما سریع‌تر اتفاق می‌افتند، زیرا نشانه‌های قدیمی کمتری برای طرفداران وجود دارد، و نمونه‌های برنامه قدیمی شما به‌محض فعال شدن دوباره به‌طور خودکار مجدداً مشترک می‌شوند.

موفقیت تحویل را اندازه گیری کنید

برای دریافت دقیق‌ترین تصویر از تحویل پیام، بهتر است پیام‌ها را فقط به برنامه‌هایی که به‌طور فعال استفاده می‌شوند ارسال کنید. این امر به ویژه در صورتی مهم است که به طور مرتب به موضوعاتی با تعداد مشترکین زیاد پیام ارسال می کنید. اگر بخشی از این مشترکین واقعاً غیرفعال باشند، تأثیر آن بر آمار تحویل شما می تواند در طول زمان قابل توجه باشد.

قبل از هدف قرار دادن پیام‌ها به یک توکن، در نظر بگیرید:

  • آیا Google Analytics، داده‌های جمع‌آوری‌شده در BigQuery یا سایر سیگنال‌های ردیابی نشان‌دهنده فعال بودن توکن هستند؟
  • آیا تلاش های قبلی برای تحویل به طور مداوم در یک دوره زمانی شکست خورده است؟
  • آیا رمز ثبت نام در سرورهای شما در یک ماه گذشته به روز شده است؟
  • برای دستگاه‌های Android، آیا FCM Data API درصد بالایی از شکست‌های تحویل پیام را به دلیل droppedDeviceInactive گزارش می‌کند؟

برای اطلاعات بیشتر درباره تحویل، به درک تحویل پیام مراجعه کنید.