অ্যান্ড্রয়েডে ডাউনস্ট্রিম মেসেজের ডেলিভারি অগ্রাধিকার নির্ধারণের জন্য আপনার কাছে দুটি বিকল্প রয়েছে: সাধারণ এবং উচ্চ অগ্রাধিকার। সাধারণ এবং উচ্চ অগ্রাধিকারের মেসেজের ডেলিভারি এইভাবে কাজ করে:
সাধারণ অগ্রাধিকার। ডেটা এবং নোটিফিকেশন মেসেজের জন্য এটিই ডিফল্ট অগ্রাধিকার। ডিভাইস স্লিপিং মোডে না থাকলে সাধারণ অগ্রাধিকারের মেসেজগুলো তাৎক্ষণিকভাবে ডেলিভারি হয়। ডিভাইস যখন ডোজ মোডে থাকে, তখন ব্যাটারি সাশ্রয়ের জন্য ডেলিভারি বিলম্বিত হতে পারে, যতক্ষণ না ডিভাইসটি ডোজ মোড থেকে বেরিয়ে আসে। কম জরুরি মেসেজের জন্য, যেমন নতুন ইমেলের নোটিফিকেশন, আপনার UI সিঙ্ক করা, বা ব্যাকগ্রাউন্ডে অ্যাপ ডেটা সিঙ্ক করার ক্ষেত্রে, সাধারণ ডেলিভারি অগ্রাধিকার বেছে নিন।
উচ্চ অগ্রাধিকার। FCM উচ্চ অগ্রাধিকারের বার্তাগুলো অবিলম্বে পৌঁছে দেওয়ার চেষ্টা করে, যার ফলে FCM প্রয়োজনে একটি ঘুমন্ত ডিভাইসকে জাগিয়ে তুলতে এবং কিছু সীমিত প্রসেসিং (অত্যন্ত সীমিত নেটওয়ার্ক অ্যাক্সেস সহ) চালাতে পারে। উচ্চ অগ্রাধিকারের বার্তাগুলোর ফলে সাধারণত ব্যবহারকারী আপনার অ্যাপ বা এর নোটিফিকেশনগুলোর সাথে ইন্টারঅ্যাক্ট করবে।
উচ্চ এবং সাধারণ অগ্রাধিকার বার্তাগুলির মধ্যে সিদ্ধান্ত নেওয়া
সাধারণ আপডেটের জন্য সাধারণ প্রায়োরিটি মেসেজ উপযুক্ত হলেও, জরুরি বিষয় বা কাজের জন্য তাৎক্ষণিক ডেলিভারি নিশ্চিত করতে উচ্চ প্রায়োরিটি বেছে নিন। যেহেতু ডোজ মোডের কারণে সাধারণ প্রায়োরিটি মেসেজের ডেলিভারির সময় প্রভাবিত হতে পারে, তাই আপনার ব্যবহারকারীদের কাছে দৃশ্যমান বেশিরভাগ নোটিফিকেশনকে উচ্চ প্রায়োরিটিতে সেট করলে সেগুলো দ্রুত ডেলিভারি নিশ্চিত হবে। উদাহরণস্বরূপ, চ্যাট মেসেজ, অ্যাকাউন্টের সমস্যা বা ফুড ডেলিভারি আপডেটের মতো নোটিফিকেশনগুলোকে উচ্চ প্রায়োরিটিতে সেট করা উচিত।
উচ্চ এবং সাধারণ অগ্রাধিকারের বার্তাগুলির জন্য বার্তা প্রক্রিয়াকরণ
অ্যান্ড্রয়েড ডিভাইসে প্রাপ্ত উচ্চ অগ্রাধিকার এবং সাধারণ অগ্রাধিকার উভয় ধরনের মেসেজের ক্ষেত্রেই, onMessageReceived হ্যান্ডলারে মেসেজ পেলোড প্রসেস করার জন্য কয়েক সেকেন্ড সময় দেওয়া হয়, যেখানে সাধারণ অগ্রাধিকারের মেসেজের তুলনায় উচ্চ অগ্রাধিকারের মেসেজের জন্য কিছুটা বেশি সময় বরাদ্দ করা হয়। এই সময়টি শুধুমাত্র তাৎক্ষণিকভাবে একটি নোটিফিকেশন রেন্ডার করার জন্য যথেষ্ট বলে ধরে নেওয়া হয়। যদি আপনাকে ডিভাইস স্টোরেজ থেকে কোনো ছবি লোড করা বা অতিরিক্ত কন্টেন্ট সংগ্রহের জন্য আপনার সার্ভারকে কল করার মতো কোনো অতিরিক্ত কাজ করতে হয়, তাহলে আপনাকে অতিরিক্ত পদক্ষেপ নিতে হবে।
onMessageReceived মেথডটি একটি আলাদা ওয়ার্কার থ্রেডে কল করা হয়। সর্বোত্তম অনুশীলন হিসেবে, আপনার উচিত onMessageReceived মেথডের মধ্যেই মেসেজ পেলোড প্রসেস করা এবং সাথে সাথে একটি নোটিফিকেশন প্রদর্শন করা। onMessageReceived মেথডের মধ্যে আপনার অতিরিক্ত অ্যাসিঙ্ক্রোনাস নেটওয়ার্ক কল করা বা একটি আলাদা থ্রেডে পেলোড প্রসেসিং করা উচিত নয়, কারণ এমনটা করলে পেলোড সম্পূর্ণরূপে প্রসেস হওয়ার আগেই আপনার অ্যাপ্লিকেশনটি একটি বৈধ প্রসেস লাইফসাইকেলের বাইরে চলে যেতে পারে। যদি এমনটা হয়, তাহলে আপনি দেখতে পারেন যে পাঠানো কিছু নির্দিষ্ট FCM মেসেজের ফলে নোটিফিকেশন দেরিতে আসছে বা অনুপস্থিত থাকছে।
আপনার মেসেজ প্রসেস করার জন্য যদি অতিরিক্ত সময়ের প্রয়োজন হয়, উদাহরণস্বরূপ আপনার মেসেজ পেলোডে থাকা কোনো imageUrl আনার জন্য, তাহলে অ্যাপ্লিকেশন লাইফসাইকেল বাড়ানোর জন্য আপনাকে WorkManager বা ফোরগ্রাউন্ড সার্ভিসের (foreground service) মতো কোনো কনস্ট্রাক্ট ব্যবহার করতে হবে। আপনার নোটিফিকেশনগুলো সম্পূর্ণরূপে প্রসেস হয়েছে কিনা তা যাচাই করার জন্য, যখন আপনি onMessageReceived মেথডটি ওভাররাইড করবেন , তখন নিম্নলিখিত নির্দেশিকা অনুসরণ করা উচিত।
- উচ্চ অগ্রাধিকারের নোটিফিকেশনের জন্য: আপনার নোটিফিকেশন রেন্ডারিং সম্পূর্ণভাবে সম্পন্ন হচ্ছে কিনা তা যাচাই করতে, অ্যান্ড্রয়েড
WorkManagerব্যবহার করে একটি এক্সপেডিটেড জব শুরু করুন, যাতে আপনার উচ্চ অগ্রাধিকারের নোটিফিকেশনটি অগ্রাধিকারমূলক প্রক্রিয়াকরণের সময় পায়। সুখবর হলো, উচ্চ অগ্রাধিকারের এফসিএম প্রক্রিয়াকরণের ফলে এক্সপেডিটেড জবের কোটা শেষ হয়ে যাওয়ার বিষয়ে যদি আপনি চিন্তিত হন, তবে আপনার উদ্বিগ্ন হওয়ার কোনো প্রয়োজন নেই। উচ্চ অগ্রাধিকারের এফসিএম-এরonMessageReceivedডিসপ্যাচ হওয়ার ঠিক পরেই নির্ধারিত এক্সপেডিটেড জবগুলোর জন্য একটি সংক্ষিপ্ত ছাড় রয়েছে। - সাধারণ প্রায়োরিটি নোটিফিকেশনের জন্য: এর পরিবর্তে অ্যান্ড্রয়েড
WorkManagerব্যবহার করে একটি সাধারণWorkRequestশুরু করুন। এটি নিশ্চিত করবে যে আপনার নোটিফিকেশন প্রসেস করার জন্য প্রয়োজনীয় অতিরিক্ত কাজটি শেষ পর্যন্ত সম্পন্ন হয়, এবং এর ফলে প্রায়োরিটি প্রসেসিং ব্যবহার হবে না ও অপ্রয়োজনীয় ব্যাটারি খরচের সমস্যা তৈরি হবে না।
বার্তাগুলির জন্য অগ্রাধিকার নির্ধারণ করা
আপনি Admin SDK , এফসিএম রেস্ট এপিআই FCM REST API), এবং ফায়ারবেস কনসোল Firebase console) ব্যবহার করে আপনার ব্যবহারকারীদের কাছে নোটিফিকেশন পাঠাতে পারেন। Admin SDK এবং এফসিএম রেস্ট এপিআই থেকে আপনার প্রায়োরিটি সেটিং পরিবর্তন করতে, আপনাকে মেসেজ JSON পেলোড আপডেট করতে হবে। প্রায়োরিটি কীভাবে হাই (high) সেট করতে হয় তা দেখতে আপনি নিম্নলিখিত কোড স্যাম্পলটি ব্যবহার করতে পারেন। কনসোল থেকে পাঠানো নোটিফিকেশনের ক্ষেত্রে, অ্যান্ড্রয়েড-নির্দিষ্ট নোটিফিকেশন ফিল্ড সেট করা সমর্থিত নয়।
{
"message": {
"notification": {
"body": "Purchase exceeding $500 detected",
"title": "Credit card purchase"
},
"data": {
"purchaser": "Your child",
"items": "Gravity Defier Sneakers"
},
"android": {
"priority": "high"
},
"apns": {
"headers": {
"apns-priority": "5"
}
}
}
}
ডোজ মোডে আপনার উচ্চ অগ্রাধিকারের নোটিফিকেশনগুলো পরীক্ষা করুন।
ব্যবহারকারীর কাছে আপনার উচ্চ অগ্রাধিকারের নোটিফিকেশনগুলো সঠিকভাবে পৌঁছাচ্ছে এবং প্রক্রিয়াজাত হচ্ছে কিনা, তা নিশ্চিত করতে নোটিফিকেশনগুলো পরীক্ষা করার জন্য এই নির্দেশাবলী অনুসরণ করুন:
- “Test your app with Doze” এর নির্দেশাবলী ব্যবহার করে আপনার ডিভাইসটিকে ডোজ মোডে সেট করুন।
- টেস্ট ডিভাইসে আপনার অ্যাপ থেকে আপনার FCM রেজিস্ট্রেশন টোকেনটি অ্যাক্সেস করুন। টোকেনটি কীভাবে অ্যাক্সেস করতে হয় সে সম্পর্কে আরও তথ্যের জন্য, “ব্যাকগ্রাউন্ড অ্যাপে একটি টেস্ট মেসেজ পাঠান” দেখুন।
- একবার আপনার কাছে FCM টোকেন চলে এলে, আপনার FCM নোটিফিকেশন পাঠানোর কোড ব্যবহার করে অথবা এমন একটি cURL কমান্ড দিয়ে টেস্ট ডিভাইসটিতে আপনার উচ্চ অগ্রাধিকারের নোটিফিকেশনটি পাঠান, যেটির কনফিগারেশন প্যারামিটারগুলো আপনার উচ্চ অগ্রাধিকারের নোটিফিকেশনের সাথে মেলে।
অ্যান্ড্রয়েডে উচ্চ অগ্রাধিকার সম্পন্ন FCM এর অগ্রাধিকার হ্রাস
অ্যান্ড্রয়েডে উচ্চ অগ্রাধিকারের বার্তাগুলি সময়-সংবেদনশীল, ব্যবহারকারীর কাছে দৃশ্যমান বিষয়বস্তুর জন্য ব্যবহৃত হয় এবং এগুলির ফলে ব্যবহারকারীর কাছে নোটিফিকেশন আসা উচিত। যদি FCM এমন কোনো প্যাটার্ন শনাক্ত করে যেখানে বার্তাগুলির ফলে ব্যবহারকারীর কাছে নোটিফিকেশন আসছে না, তাহলে আপনার বার্তাগুলির অগ্রাধিকার কমিয়ে সাধারণ অগ্রাধিকার দেওয়া হতে পারে অথবা সেগুলি পরিচালনার জন্য Google Play পরিষেবাগুলিকে দায়িত্ব দেওয়া হতে পারে ।
মেসেজকে অগ্রাধিকারহীন করা হবে নাকি প্রক্সি করা হবে, তা নির্ধারণ করার জন্য FCM বিগত ৭ দিনের মেসেজের আচরণ ব্যবহার করে; এটি আপনার অ্যাপ্লিকেশনের প্রতিটি ইনস্ট্যান্সের জন্য স্বাধীনভাবে এই সিদ্ধান্ত নেয়। যদি উচ্চ অগ্রাধিকারের মেসেজের প্রতিক্রিয়ায় নোটিফিকেশনগুলো এমনভাবে প্রদর্শিত হয় যা ব্যবহারকারীর কাছে দৃশ্যমান, তাহলে আপনার ভবিষ্যতের উচ্চ-অগ্রাধিকারের মেসেজগুলো প্রভাবিত হবে না।
গুগল প্লে পরিষেবাগুলির সাথে বিজ্ঞপ্তি প্রতিনিধিদল
নির্দিষ্ট কিছু শর্ত পূরণকারী উচ্চ অগ্রাধিকারের নোটিফিকেশন বার্তাগুলোকে অগ্রাধিকার কমানোর পরিবর্তে গুগল প্লে সার্ভিসেস দ্বারা প্রক্সি করা হয়। এর মানে হলো, অ্যাপটি চালু করার কোনো প্রয়োজন ছাড়াই, অ্যাপটির পক্ষ থেকে গুগল প্লে সার্ভিসেস নোটিফিকেশনগুলো প্রদর্শন করে। অ্যান্ড্রয়েড ডিভাইসগুলোতে সার্বিকভাবে আরও ভালো ব্যবহারকারীর অভিজ্ঞতা প্রদানের জন্য এটি করা হয়।
উল্লেখ্য যে, প্রক্সি করা নোটিফিকেশন মেসেজগুলো, মেসেজ গ্রহণ সংক্রান্ত অ্যানালিটিক্স যেভাবে রিপোর্ট করা হয়, তাতে পরিবর্তন নিয়ে আসে:
- প্রক্সি করা নোটিফিকেশনের অ্যানালিটিক্স রিপোর্ট পাওয়ার জন্য, আপনার অ্যাপে অবশ্যই FCM SDK ভার্সন 24.0.0 বা তার উচ্চতর সংস্করণ ব্যবহার করতে হবে।
- প্রক্সিড নোটিফিকেশন চালু হওয়ার আগের তুলনায় প্রাপ্ত মেসেজের সংখ্যায় আপনি বিলম্ব বা হ্রাস লক্ষ্য করতে পারেন। এর কারণ হলো, প্রক্সিড নোটিফিকেশনের অ্যানালিটিক্স শুধুমাত্র আপনার অ্যাপ চালু হওয়ার পরেই রিপোর্ট করা হয় এবং নোটিফিকেশনটির ফলে অ্যাপটি না খুললে তা মোটেও রিপোর্ট নাও করা হতে পারে।
এইভাবে নোটিফিকেশন মেসেজ প্রক্সি করা হলো সেইসব অ্যাপের ডিফল্ট আচরণ, যেগুলো Android Q+ এবং Google Play services ভার্সন 19054000 বা তার পরবর্তী সংস্করণ ব্যবহার করে। HTTP v1 API-এর মাধ্যমে পাঠানো মেসেজ প্রক্সি করা হয়, কিন্তু Firebase কনসোল বা লিগ্যাসি API-এর মাধ্যমে পাঠানো মেসেজ প্রক্সি করা হবে না । উল্লেখ্য যে, এই ফিচারটি বর্তমানে বিটা পর্যায়ে রয়েছে এবং এতে পরিবর্তন আসতে পারে।
যদিও ডিভাইসের ব্যাটারি ও মেমরির সুবিধার জন্য আমরা ডেলিগেশন চালু রাখার জোরালো পরামর্শ দিই, আপনি নিম্নলিখিত যেকোনো উপায়ে এই আচরণটি বন্ধ করতে পারেন:
- অ্যাপ-স্তরে: আপনার অ্যাপ ম্যানিফেস্টে
<meta-data android:name= "delivery_metrics_exported_to_big_query_enabled" android:value="false"/>ডিরেক্টিভটি যোগ করুন। - অ্যাপ ইনস্ট্যান্সের ভিত্তিতে: নির্দিষ্ট ব্যবহারের ক্ষেত্রের ওপর নির্ভর করে, আপনার অ্যাপের UI ফ্লো-তে
fun setNotificationDelegationEnabled(disable: Boolean): Task<Void!>সেট করুন। - প্রতিটি বার্তার জন্য: প্রেরণের অনুরোধের ক্ষেত্রে
AndroidNotificationঅবজেক্টেproxyকী-টিDENYতে সেট করুন।
অ্যান্ড্রয়েডে বার্তার অগ্রাধিকার হ্রাস পরিমাপ করা
স্বতন্ত্র বার্তা। ডেলিভারির সময়, আপনি getPriority() থেকে প্রাপ্ত ডেলিভারি হওয়া প্রায়োরিটির সাথে getOriginalPriority() থেকে প্রাপ্ত আসল প্রায়োরিটি তুলনা করে নির্ধারণ করতে পারেন যে কোনো একটি স্বতন্ত্র বার্তার প্রায়োরিটি কমানো হয়েছে কি না।
সমস্ত বার্তা। FCM অ্যাগ্রিগেট ডেলিভারি ডেটা API রিপোর্ট করতে পারে যে আপনার অ্যান্ড্রয়েডে পাঠানো সমস্ত বার্তার কত শতাংশকে অগ্রাধিকারের তালিকা থেকে বাদ দেওয়া হচ্ছে। অ্যাগ্রিগেট ডেটা রিপোর্ট থেকে কিছু বার্তা বাদ পড়তে পারে, কিন্তু সামগ্রিকভাবে এগুলি বার্তা অগ্রাধিকারের তালিকা থেকে বাদ পড়ার হারের একটি সার্বিক চিত্র দেবে। আরও তথ্যের জন্য এবং API কোয়েরি করার নমুনা কোডের জন্য অ্যাগ্রিগেটেড ডেলিভারি ডেটা সম্পর্কিত আমাদের নিবন্ধটি দেখুন; এটি API এক্সপ্লোরার থেকেও দেখা যেতে পারে।
প্রক্সি করা নোটিফিকেশন। প্রক্সি করা নোটিফিকেশনগুলো বর্তমান FCM বা GA ডেলিভারি মেট্রিক্সে গণনা করা হবে না, তাই আপনি নোটিফিকেশন ডেলিভারি মেট্রিক্সে ১৫% পর্যন্ত হ্রাস দেখতে পারেন। প্রক্সি করা মেসেজের উপর রিপোর্টিংয়ের জন্য, FCM অ্যাগ্রিগেট ডেলিভারি ডেটা API ব্যবহার করুন।
ProxyNotificationInsightPercentsসফলভাবে প্রক্সি করা নোটিফিকেশনের শতাংশের পাশাপাশি যে মেসেজগুলো সফলভাবে প্রক্সি করা যায়নি সেগুলোর বিস্তারিত তথ্যও রিপোর্ট করে।
সমস্যা সমাধান বিজ্ঞপ্তি বিলম্ব
নিশ্চিত করুন যে আপনার অ্যাপ ইনস্ট্যান্সে নোটিফিকেশন চালু আছে। যদি ব্যবহারকারী আপনার অ্যাপের জন্য নোটিফিকেশনের অনুমতি নিষ্ক্রিয় করে রাখেন, তাহলে আপনার কোনো নোটিফিকেশনই পোস্ট করা হবে না, ফলে আপনার বার্তাগুলোর অগ্রাধিকার কমে যাবে। কোনো অ্যাপ্লিকেশন ইনস্ট্যান্সে উচ্চ অগ্রাধিকারের বার্তা পাঠানোর আগে আপনার যাচাই করে নেওয়া উচিত যে নোটিফিকেশন চালু আছে ।
আপনার নোটিফিকেশন প্রসেস করার সময় অতিরিক্ত নেটওয়ার্ক কল করা থেকে বিরত থাকুন। যেহেতু অ্যান্ড্রয়েড মোবাইল ব্যবহারকারীদের একটি ক্ষুদ্র অংশ উচ্চ ল্যাটেন্সিযুক্ত নেটওয়ার্ক ব্যবহার করেন, তাই নোটিফিকেশন দেখানোর আগে আপনার সার্ভারের সাথে সংযোগ স্থাপন করা থেকে বিরত থাকুন। অনুমোদিত প্রসেসিং সময় শেষ হওয়ার আগে সার্ভারে কল করা উচ্চ ল্যাটেন্সিযুক্ত নেটওয়ার্কের ব্যবহারকারীদের জন্য ঝুঁকিপূর্ণ হতে পারে।
এর পরিবর্তে, নোটিফিকেশনের বিষয়বস্তু FCM মেসেজে অন্তর্ভুক্ত করুন এবং তা অবিলম্বে প্রদর্শন করুন। অ্যান্ড্রয়েডে অতিরিক্ত ইন-অ্যাপ কন্টেন্টের জন্য সিঙ্ক করার প্রয়োজন হলে, আপনি ব্যাকগ্রাউন্ডে কাজটি পরিচালনা করার জন্য WorkManager-এর মাধ্যমে একটি টাস্ক শিডিউল করতে পারেন।