যদি আপনি প্রোগ্রাম্যাটিকভাবে পাঠানোর অনুরোধ তৈরি করতে FCM API ব্যবহার করেন, তাহলে আপনি দেখতে পাবেন যে, সময়ের সাথে সাথে, আপনি পুরানো নিবন্ধন টোকেন সহ নিষ্ক্রিয় ডিভাইসগুলিতে বার্তা পাঠিয়ে সম্পদ নষ্ট করছেন। এই পরিস্থিতি Firebase কনসোলে রিপোর্ট করা বার্তা বিতরণ ডেটা বা BigQuery-তে রপ্তানি করা ডেটাকে প্রভাবিত করতে পারে, যা বিতরণ হারে নাটকীয় (কিন্তু আসলে বৈধ নয়) হ্রাস হিসাবে দেখা দেয়। এই নির্দেশিকাটি দক্ষ বার্তা লক্ষ্যবস্তু এবং বৈধ বিতরণ প্রতিবেদন নিশ্চিত করতে আপনি নিতে পারেন এমন কিছু পদক্ষেপ নিয়ে আলোচনা করে।
পুরনো এবং মেয়াদোত্তীর্ণ নিবন্ধন টোকেন
স্টেল রেজিস্ট্রেশন টোকেন হল নিষ্ক্রিয় ডিভাইসগুলির সাথে যুক্ত টোকেন যা এক মাসেরও বেশি সময় ধরে FCM সাথে সংযুক্ত নয়। সময়ের সাথে সাথে, ডিভাইসটির আবার কখনও FCM সাথে সংযুক্ত হওয়ার সম্ভাবনা ক্রমশ কমতে থাকে। এই স্টেল টোকেনগুলির জন্য বার্তা প্রেরণ এবং বিষয় ফ্যানআউটগুলি কখনও বিতরণ করার সম্ভাবনা কম।
একটি টোকেন পুরনো হয়ে যাওয়ার বেশ কয়েকটি কারণ থাকতে পারে। উদাহরণস্বরূপ, টোকেনটি যে ডিভাইসের সাথে যুক্ত তা হারিয়ে যেতে পারে, ধ্বংস হতে পারে, অথবা স্টোরেজে রাখা হতে পারে এবং ভুলে যেতে পারে।
অ্যান্ড্রয়েডের ক্ষেত্রে, যখন পুরানো টোকেনগুলি ২৭০ দিনের নিষ্ক্রিয়তায় পৌঁছে যায়, তখন FCM সেগুলিকে মেয়াদোত্তীর্ণ বলে মনে করে। একবার একটি টোকেনের মেয়াদ শেষ হয়ে গেলে, FCM এটিকে অবৈধ হিসাবে চিহ্নিত করে এবং এতে পাঠানো পাঠানো প্রত্যাখ্যান করে। তবে, বিরল ক্ষেত্রে যখন ডিভাইসটি আবার সংযুক্ত হয় এবং অ্যাপটি খোলা হয় তখন FCM অ্যাপের জন্য একটি নতুন টোকেন জারি করে।
iOS এর মতো অন্যান্য প্ল্যাটফর্মের জন্য, FCM অন্তর্নিহিত পুশ পরিষেবার (যেমন, APN) উপর নির্ভর করে, যার 270-দিনের নিষ্ক্রিয়তা-ভিত্তিক টোকেনের মেয়াদ শেষ হয় না। তাই আমরা আপনাকে সক্রিয়ভাবে টোকেনের সতেজতা বজায় রাখার এবং পুরানো নিবন্ধন টোকেনগুলি সরিয়ে ফেলার পরামর্শ দিচ্ছি।
মৌলিক সর্বোত্তম অনুশীলন
FCM API ব্যবহার করে প্রোগ্রাম্যাটিকভাবে সেন্ড রিকোয়েস্ট তৈরি করে এমন যেকোনো অ্যাপে আপনার কিছু মৌলিক অনুশীলন অনুসরণ করা উচিত। প্রধান সেরা অনুশীলনগুলি হল:
- FCM থেকে নিবন্ধন টোকেনগুলি পুনরুদ্ধার করুন এবং সেগুলি আপনার সার্ভারে সংরক্ষণ করুন। সার্ভারের জন্য একটি গুরুত্বপূর্ণ ভূমিকা হল প্রতিটি ক্লায়েন্টের টোকেনের ট্র্যাক রাখা এবং সক্রিয় টোকেনগুলির একটি আপডেট তালিকা রাখা। আমরা দৃঢ়ভাবে আপনার কোড এবং আপনার সার্ভারে একটি টোকেন টাইমস্ট্যাম্প প্রয়োগ করার এবং নিয়মিত বিরতিতে এই টাইমস্ট্যাম্পটি আপডেট করার পরামর্শ দিচ্ছি।
- টোকেনের সতেজতা বজায় রাখুন এবং পুরনো টোকেনগুলি সরিয়ে ফেলুন। FCM আর বৈধ বলে মনে করে না এমন টোকেনগুলি সরিয়ে ফেলার পাশাপাশি, আপনি অন্যান্য লক্ষণগুলি পর্যবেক্ষণ করতে পারেন যে টোকেনগুলি পুরনো হয়ে গেছে এবং সেগুলি সক্রিয়ভাবে সরিয়ে ফেলতে পারেন। এই নির্দেশিকাটি এটি অর্জনের জন্য আপনার কিছু বিকল্প নিয়ে আলোচনা করে।
নিবন্ধন টোকেনগুলি পুনরুদ্ধার এবং সংরক্ষণ করুন
আপনার অ্যাপের প্রাথমিক স্টার্টআপে, FCM SDK ক্লায়েন্ট অ্যাপ ইনস্ট্যান্সের জন্য একটি নিবন্ধন টোকেন তৈরি করে। এটি হল সেই টোকেন যা আপনাকে API থেকে লক্ষ্যবস্তু পাঠানোর অনুরোধে অন্তর্ভুক্ত করতে হবে, অথবা লক্ষ্যবস্তু বিষয়গুলির জন্য বিষয় সাবস্ক্রিপশনে যোগ করতে হবে।
আমরা দৃঢ়ভাবে সুপারিশ করছি যে আপনার অ্যাপটি প্রাথমিক স্টার্টআপে এই টোকেনটি পুনরুদ্ধার করুন এবং এটি আপনার অ্যাপ সার্ভারে একটি টাইমস্ট্যাম্পের পাশাপাশি সংরক্ষণ করুন । এই টাইমস্ট্যাম্পটি আপনার কোড এবং আপনার সার্ভার দ্বারা প্রয়োগ করা আবশ্যক, কারণ এটি আপনার জন্য FCM SDK দ্বারা সরবরাহ করা হয় না।
এছাড়াও, টোকেনটি সার্ভারে সংরক্ষণ করা এবং টাইমস্ট্যাম্পটি পরিবর্তন হলে আপডেট করা গুরুত্বপূর্ণ, যেমন কখন:
- অ্যাপটি একটি নতুন ডিভাইসে পুনরুদ্ধার করা হয়েছে
- ব্যবহারকারী অ্যাপটি আনইনস্টল বা পুনরায় ইনস্টল করেন
- ব্যবহারকারী অ্যাপ ডেটা সাফ করে
- FCM এর বিদ্যমান টোকেনের মেয়াদ শেষ হয়ে যাওয়ার পরে অ্যাপটি আবার সক্রিয় হয়।
উদাহরণ: Cloud Firestore টোকেন এবং টাইমস্ট্যাম্প সংরক্ষণ করুন
উদাহরণস্বরূপ, আপনি fcmTokens
নামক একটি সংগ্রহে টোকেন সংরক্ষণ করতে Cloud Firestore ব্যবহার করতে পারেন। সংগ্রহের প্রতিটি ডকুমেন্ট আইডি একটি ব্যবহারকারী আইডির সাথে সম্পর্কিত, এবং ডকুমেন্টটি বর্তমান নিবন্ধন টোকেন এবং এর সর্বশেষ আপডেট হওয়া টাইমস্ট্যাম্প সংরক্ষণ করে। এই 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
কল করে 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 (error.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 একটি অবৈধ টোকেন প্রতিক্রিয়া ফেরত দেয়। যদি আপনার নিজস্ব সংজ্ঞা অনুসারে আরও সঠিকভাবে স্টেলনেস ট্র্যাক করার প্রয়োজন হয়, তাহলে আপনি সক্রিয়ভাবে স্টেল রেজিস্ট্রেশন টোকেনগুলি সরাতে পারেন।
নিয়মিতভাবে টোকেন আপডেট করুন
আমরা আপনাকে সুপারিশ করছি যে আপনি পর্যায়ক্রমে আপনার সার্ভারে সমস্ত নিবন্ধন টোকেন পুনরুদ্ধার এবং আপডেট করুন। এর জন্য আপনাকে অবশ্যই:
- আপনার ক্লায়েন্ট অ্যাপে অ্যাপ লজিক যোগ করুন এবং উপযুক্ত API কল (যেমন
token(completion):
for Apple platforms অথবাgetToken()
for 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(); });
});
বিষয়গুলি থেকে পুরানো টোকেনগুলি আনসাবস্ক্রাইব করুন
যদি আপনি বিষয়গুলি ব্যবহার করেন, তাহলে আপনি যে বিষয়গুলিতে সাবস্ক্রাইব করেছেন সেগুলি থেকে পুরানো টোকেনগুলি নিবন্ধনমুক্ত করতে চাইতে পারেন। এর জন্য দুটি ধাপ জড়িত:
- আপনার অ্যাপটি প্রতি মাসে একবার এবং যখনই নিবন্ধন টোকেন পরিবর্তন করে তখনই বিষয়গুলিতে পুনরায় সাবস্ক্রাইব করা উচিত। এটি একটি স্ব-নিরাময় সমাধান তৈরি করে, যেখানে কোনও অ্যাপ আবার সক্রিয় হলে সাবস্ক্রিপশনগুলি স্বয়ংক্রিয়ভাবে পুনরায় উপস্থিত হয়।
- যদি কোনও অ্যাপ ইনস্ট্যান্স এক মাস ধরে নিষ্ক্রিয় থাকে (অথবা আপনার নিজস্ব স্ট্যালেনেস উইন্ডো), তাহলে FCM ব্যাকএন্ড থেকে টপিক ম্যাপিংয়ের টোকেন মুছে ফেলার জন্য Firebase Admin SDK ব্যবহার করে আপনার এটিকে টপিক থেকে আনসাবস্ক্রাইব করা উচিত।
এই দুটি ধাপের সুবিধা হল, আপনার ফ্যানআউটগুলি দ্রুত ঘটবে কারণ ফ্যান আউট করার জন্য কম স্টেল টোকেন থাকবে এবং আপনার স্টেল অ্যাপ ইনস্ট্যান্সগুলি আবার সক্রিয় হওয়ার পরে স্বয়ংক্রিয়ভাবে পুনরায় সাবস্ক্রাইব হবে।
ডেলিভারির সাফল্য পরিমাপ করুন
বার্তা সরবরাহের সবচেয়ে সঠিক চিত্র পেতে, শুধুমাত্র সক্রিয়ভাবে ব্যবহৃত অ্যাপ ইনস্ট্যান্সগুলিতে বার্তা পাঠানোই ভালো। এটি বিশেষভাবে গুরুত্বপূর্ণ যদি আপনি নিয়মিতভাবে প্রচুর সংখ্যক গ্রাহক সহ বিষয়গুলিতে বার্তা পাঠান; যদি সেই গ্রাহকদের একটি অংশ আসলে নিষ্ক্রিয় থাকে, তাহলে সময়ের সাথে সাথে আপনার বিতরণ পরিসংখ্যানের উপর প্রভাব উল্লেখযোগ্য হতে পারে।
টোকেনে বার্তাগুলিকে লক্ষ্য করার আগে, বিবেচনা করুন:
- গুগল অ্যানালিটিক্স, বিগকুয়েরিতে ধারণ করা ডেটা, অথবা অন্যান্য ট্র্যাকিং সিগন্যাল কি টোকেনটি সক্রিয় থাকার ইঙ্গিত দেয়?
- পূর্ববর্তী ডেলিভারি প্রচেষ্টা কি বেশ কিছু সময় ধরে ধারাবাহিকভাবে ব্যর্থ হয়েছে?
- গত মাসে কি আপনার সার্ভারে রেজিস্ট্রেশন টোকেন আপডেট করা হয়েছে?
- অ্যান্ড্রয়েড ডিভাইসের ক্ষেত্রে, FCM ডেটা API কি
droppedDeviceInactive
এর কারণে বার্তা সরবরাহ ব্যর্থতার উচ্চ শতাংশ রিপোর্ট করে?
ডেলিভারি সম্পর্কে আরও তথ্যের জন্য, বার্তা ডেলিভারি বোঝা দেখুন।