FCM রেজিস্ট্রেশন টোকেন ব্যবস্থাপনার জন্য সর্বোত্তম অনুশীলন

আপনি যদি প্রোগ্রামগতভাবে অনুরোধ পাঠানোর জন্য FCM API ব্যবহার করেন, তাহলে আপনি দেখতে পাবেন যে, সময়ের সাথে সাথে, আপনি পুরানো রেজিস্ট্রেশন টোকেন সহ নিষ্ক্রিয় ডিভাইসগুলিতে বার্তা পাঠিয়ে সম্পদ নষ্ট করছেন। এই পরিস্থিতি Firebase কনসোলে রিপোর্ট করা মেসেজ ডেলিভারি ডেটা বা BigQuery-এ রপ্তানি করা ডেটাকে প্রভাবিত করতে পারে, যা ডেলিভারির হারে নাটকীয় (কিন্তু আসলে বৈধ নয়) হিসাবে দেখা যাচ্ছে। দক্ষ বার্তা টার্গেটিং এবং বৈধ ডেলিভারি রিপোর্টিং নিশ্চিত করতে সাহায্য করার জন্য আপনি নিতে পারেন এমন কিছু ব্যবস্থা নিয়ে এই গাইডটি আলোচনা করে।

বাসি এবং মেয়াদোত্তীর্ণ নিবন্ধন টোকেন

বাসি রেজিস্ট্রেশন টোকেন হল নিষ্ক্রিয় ডিভাইসগুলির সাথে যুক্ত টোকেন যেগুলি এক মাসেরও বেশি সময় ধরে FCM-এর সাথে সংযুক্ত হয়নি৷ সময় অতিবাহিত হওয়ার সাথে সাথে ডিভাইসটির পুনরায় FCM এর সাথে সংযোগ করার সম্ভাবনা কম এবং কম হয়ে যায়। এই বাসি টোকেনগুলির জন্য মেসেজ পাঠানো এবং টপিক ফ্যানআউটগুলি কখনও বিতরণ করার সম্ভাবনা কম।

একটি টোকেন বাসি হতে পারে কেন বিভিন্ন কারণ আছে. উদাহরণস্বরূপ, টোকেনটি যে ডিভাইসটির সাথে যুক্ত সেটি হারিয়ে যেতে পারে, ধ্বংস হতে পারে বা স্টোরেজে রাখা এবং ভুলে যেতে পারে।

যখন পুরানো টোকেনগুলি 270 দিনের নিষ্ক্রিয়তায় পৌঁছায়, FCM সেগুলিকে মেয়াদ উত্তীর্ণ টোকেন বিবেচনা করবে৷ একবার একটি টোকেনের মেয়াদ শেষ হয়ে গেলে, FCM এটিকে অবৈধ হিসাবে চিহ্নিত করে এবং এটিতে পাঠানো প্রত্যাখ্যান করে। যাইহোক, FCM অ্যাপের উদাহরণের জন্য একটি নতুন টোকেন জারি করে যে বিরল ক্ষেত্রে ডিভাইসটি আবার সংযোগ করে এবং অ্যাপটি খোলা হয়।

মৌলিক সেরা অনুশীলন

এমন কিছু মৌলিক অনুশীলন রয়েছে যা আপনাকে যে কোনো অ্যাপে অনুসরণ করা উচিত যা প্রোগ্রামগতভাবে অনুরোধ পাঠানোর জন্য FCM API ব্যবহার করে। প্রধান সেরা অনুশীলন হল:

  • FCM থেকে রেজিস্ট্রেশন টোকেনগুলি পুনরুদ্ধার করুন এবং সেগুলি আপনার সার্ভারে সংরক্ষণ করুন৷ সার্ভারের জন্য একটি গুরুত্বপূর্ণ ভূমিকা হল প্রতিটি ক্লায়েন্টের টোকেনের ট্র্যাক রাখা এবং সক্রিয় টোকেনের একটি আপডেট তালিকা রাখা। আমরা দৃঢ়ভাবে আপনার কোড এবং আপনার সার্ভারে একটি টোকেন টাইমস্ট্যাম্প প্রয়োগ করার এবং নিয়মিত বিরতিতে এই টাইমস্ট্যাম্প আপডেট করার সুপারিশ করি৷
  • টোকেন সতেজতা বজায় রাখুন এবং বাসি টোকেনগুলি সরান। FCM আর বৈধ বলে মনে করে না এমন টোকেনগুলি সরানোর পাশাপাশি, আপনি টোকেনগুলি বাসি হয়ে গেছে এমন অন্যান্য লক্ষণগুলি নিরীক্ষণ করতে চাইতে পারেন এবং সেগুলিকে সক্রিয়ভাবে মুছে ফেলতে পারেন৷ এই নির্দেশিকাটি এটি অর্জনের জন্য আপনার কিছু বিকল্প নিয়ে আলোচনা করে।

রেজিস্ট্রেশন টোকেন পুনরুদ্ধার করুন এবং সংরক্ষণ করুন

আপনার অ্যাপের প্রাথমিক স্টার্টআপে, FCM SDK ক্লায়েন্ট অ্যাপের উদাহরণের জন্য একটি নিবন্ধন টোকেন তৈরি করে। এটি এমন একটি টোকেন যা আপনাকে API থেকে টার্গেটেড সেন্ড রিকোয়েস্টে অন্তর্ভুক্ত করতে হবে, অথবা টপিক টার্গেট করার জন্য টপিক সাবস্ক্রিপশনে যোগ করতে হবে।

আমরা দৃঢ়ভাবে সুপারিশ করি যে আপনার অ্যাপটি প্রাথমিক স্টার্টআপে এই টোকেনটি পুনরুদ্ধার করুন এবং এটিকে একটি টাইমস্ট্যাম্পের সাথে আপনার অ্যাপ সার্ভারে সংরক্ষণ করুন । এই টাইমস্ট্যাম্পটি আপনার কোড এবং আপনার সার্ভার দ্বারা প্রয়োগ করা আবশ্যক, কারণ এটি আপনার জন্য FCM SDK দ্বারা সরবরাহ করা হয় না।

এছাড়াও, সার্ভারে টোকেন সংরক্ষণ করা এবং টাইমস্ট্যাম্প আপডেট করা গুরুত্বপূর্ণ, যখনই এটি পরিবর্তন হয়, যেমন যখন:

  • অ্যাপটি একটি নতুন ডিভাইসে পুনরুদ্ধার করা হয়েছে
  • ব্যবহারকারী অ্যাপটি আনইনস্টল বা পুনরায় ইনস্টল করে
  • ব্যবহারকারী অ্যাপ ডেটা সাফ করে
  • FCM এর বিদ্যমান টোকেনের মেয়াদ শেষ হয়ে যাওয়ার পরে অ্যাপটি আবার সক্রিয় হয়ে যায়

উদাহরণ: ক্লাউড ফায়ারস্টোরে টোকেন এবং টাইমস্ট্যাম্প সংরক্ষণ করুন

উদাহরণস্বরূপ, আপনি fcmTokens নামে একটি সংগ্রহে টোকেন সংরক্ষণ করতে ক্লাউড ফায়ারস্টোর ব্যবহার করতে পারেন। সংগ্রহে থাকা প্রতিটি ডকুমেন্ট আইডি একটি ইউজার আইডির সাথে মিলে যায় এবং ডকুমেন্টটি বর্তমান রেজিস্ট্রেশন টোকেন এবং এর সর্বশেষ আপডেট করা টাইমস্ট্যাম্প সংরক্ষণ করে। এই Kotlin উদাহরণে দেখানো হিসাবে set ফাংশন ব্যবহার করুন:

    /**
     * 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 কল করে ক্লাউড ফায়ারস্টোরে সংরক্ষণ করা হয়:

    /**
     * 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 থেকে অবৈধ টোকেন প্রতিক্রিয়া সনাক্ত করা নিশ্চিত করুন এবং আপনার সিস্টেম থেকে অবৈধ বা মেয়াদ উত্তীর্ণ বলে পরিচিত যেকোন নিবন্ধন টোকেন মুছে ফেলার মাধ্যমে প্রতিক্রিয়া জানান৷ HTTP v1 API-এর সাথে, এই ত্রুটির বার্তাগুলি নির্দেশ করতে পারে যে আপনার পাঠানো অনুরোধটি লক্ষ্যবস্তু অবৈধ বা মেয়াদোত্তীর্ণ টোকেন:

  • UNREGISTERED (HTTP 404)
  • INVALID_ARGUMENT (HTTP 400)

আপনি যদি নিশ্চিত হন যে মেসেজ পেলোডটি বৈধ এবং আপনি একটি টার্গেটেড টোকেনের জন্য এই প্রতিক্রিয়াগুলির মধ্যে একটি গ্রহণ করেন, তাহলে এই টোকেনের আপনার রেকর্ড মুছে ফেলা নিরাপদ, কারণ এটি আর কখনও বৈধ হবে না। উদাহরণস্বরূপ, ক্লাউড ফায়ারস্টোর থেকে অবৈধ টোকেনগুলি মুছতে, আপনি নিম্নলিখিতগুলির মতো একটি ফাংশন স্থাপন এবং চালাতে পারেন:

    // 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): অ্যাপল প্ল্যাটফর্মের জন্য বা Android এর জন্য getToken() ) এবং তারপর স্টোরেজের জন্য আপনার অ্যাপ সার্ভারে বর্তমান টোকেন পাঠান (একটি সহ টাইমস্ট্যাম্প)। এটি সমস্ত ক্লায়েন্ট বা টোকেন কভার করার জন্য কনফিগার করা একটি মাসিক কাজ হতে পারে।
  • টোকেন পরিবর্তিত হয়েছে কিনা তা নির্বিশেষে নিয়মিত বিরতিতে টোকেনের টাইমস্ট্যাম্প আপডেট করতে সার্ভার লজিক যোগ করুন।

WorkManager ব্যবহার করে টোকেন আপডেট করার জন্য Android লজিকের উদাহরণের জন্য, 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. যদি একটি অ্যাপ ইন্সট্যান্স এক মাসের জন্য নিষ্ক্রিয় থাকে (অথবা আপনার নিজের অচলতা উইন্ডো) তাহলে আপনাকে FCM ব্যাকএন্ড থেকে টপিক ম্যাপিংয়ের টোকেন মুছে ফেলতে Firebase অ্যাডমিন SDK ব্যবহার করে বিষয়গুলি থেকে সদস্যতা ত্যাগ করতে হবে।

এই দুটি পদক্ষেপের সুবিধা হল যে আপনার ফ্যানআউটগুলি দ্রুত ঘটবে কারণ ফ্যান আউট করার জন্য কম বাসি টোকেন রয়েছে এবং আপনার পুরানো অ্যাপের দৃষ্টান্তগুলি আবার সক্রিয় হয়ে গেলে স্বয়ংক্রিয়ভাবে পুনরায় সদস্যতা পাবে৷

বিতরণ সাফল্য পরিমাপ

মেসেজ ডেলিভারির সবচেয়ে সঠিক ছবি পেতে, শুধুমাত্র সক্রিয়ভাবে ব্যবহৃত অ্যাপ ইন্সট্যান্সে বার্তা পাঠানোই ভালো। এটি বিশেষভাবে গুরুত্বপূর্ণ যদি আপনি নিয়মিতভাবে বিপুল সংখ্যক গ্রাহক সহ বিষয়গুলিতে বার্তা পাঠান; যদি এই গ্রাহকদের একটি অংশ প্রকৃতপক্ষে নিষ্ক্রিয় থাকে, তবে আপনার বিতরণ পরিসংখ্যানের প্রভাব সময়ের সাথে উল্লেখযোগ্য হতে পারে।

একটি টোকেন বার্তা লক্ষ্য করার আগে, বিবেচনা করুন:

  • Google Analytics, BigQuery-এ ক্যাপচার করা ডেটা বা অন্যান্য ট্র্যাকিং সিগন্যাল কি ইঙ্গিত দেয় যে টোকেন সক্রিয় আছে?
  • পূর্ববর্তী ডেলিভারি প্রচেষ্টা একটি নির্দিষ্ট সময়ের মধ্যে ধারাবাহিকভাবে ব্যর্থ হয়েছে?
  • গত মাসে আপনার সার্ভারে নিবন্ধন টোকেন আপডেট করা হয়েছে?
  • অ্যান্ড্রয়েড ডিভাইসের জন্য, FCM ডেটা এপিআই কি droppedDeviceInactive কারণে বার্তা বিতরণ ব্যর্থতার একটি উচ্চ শতাংশ রিপোর্ট করে?

ডেলিভারি সম্পর্কে আরও তথ্যের জন্য, বার্তা বিতরণ বোঝা দেখুন।