ফায়ারবেস বিজ্ঞপ্তিগুলি প্রাপক অ্যাপের অগ্রভাগ/পটভূমির অবস্থার উপর নির্ভর করে ভিন্নভাবে আচরণ করে। আপনি যদি ফোরগ্রাউন্ডেড অ্যাপগুলি বিজ্ঞপ্তি বার্তা বা ডেটা বার্তা পেতে চান, তাহলে onMessageReceived
কলব্যাক পরিচালনা করতে আপনাকে কোড লিখতে হবে। বিজ্ঞপ্তি এবং ডেটা বার্তাগুলির মধ্যে পার্থক্যের ব্যাখ্যার জন্য, বার্তার প্রকারগুলি দেখুন৷
বার্তা পরিচালনা করা
বার্তাগুলি পেতে, FirebaseMessagingService
প্রসারিত করে এমন একটি পরিষেবা ব্যবহার করুন। আপনার পরিষেবা onMessageReceived
এবং onDeletedMessages
কলব্যাকগুলিকে ওভাররাইড করা উচিত৷
onMessageReceived
নিম্নলিখিত ব্যতিক্রমগুলি সহ বেশিরভাগ বার্তা প্রকারের জন্য প্রদান করা হয়:
আপনার অ্যাপ ব্যাকগ্রাউন্ডে থাকলে বিজ্ঞপ্তি বার্তা পাঠানো হয় । এই ক্ষেত্রে, বিজ্ঞপ্তিটি ডিভাইসের সিস্টেম ট্রেতে বিতরণ করা হয়। একটি বিজ্ঞপ্তিতে ব্যবহারকারীর ট্যাপ ডিফল্টরূপে অ্যাপ লঞ্চার খোলে।
পটভূমিতে প্রাপ্ত হলে বিজ্ঞপ্তি এবং ডেটা পেলোড উভয় সহ বার্তা । এই ক্ষেত্রে, বিজ্ঞপ্তিটি ডিভাইসের সিস্টেম ট্রেতে বিতরণ করা হয় এবং ডেটা পেলোড আপনার লঞ্চার কার্যকলাপের অভিপ্রায়ের অতিরিক্ত হিসাবে বিতরণ করা হয়।
সংক্ষেপে:
অ্যাপের অবস্থা | বিজ্ঞপ্তি | ডেটা | উভয় |
---|---|---|---|
ফোরগ্রাউন্ড | onMessageReceived | onMessageReceived | onMessageReceived |
পটভূমি | সিস্টেম ট্রে | onMessageReceived | বিজ্ঞপ্তি: সিস্টেম ট্রে তথ্য: অভিপ্রায় অতিরিক্ত. |
onMessageReceived
কলব্যাকে টাইমআউট দেওয়া হয় যা আপনাকে কেবল একটি বিজ্ঞপ্তি পোস্ট করতে সক্ষম করে তবে টাইমারগুলি অ্যাপটিকে নেটওয়ার্ক অ্যাক্সেস করতে বা অতিরিক্ত কাজ করার অনুমতি দেওয়ার জন্য ডিজাইন করা হয়নি। যেমন, আপনার অ্যাপ যদি আরও জটিল কিছু করে, তাহলে অ্যাপটি তার কাজ সম্পূর্ণ করতে পারে তা নিশ্চিত করতে আপনাকে অতিরিক্ত কাজ করতে হবে।
আপনি যদি আশা করেন যে আপনার অ্যাপের একটি বার্তা পরিচালনা করতে 10 সেকেন্ডের কাছাকাছি সময় লাগতে পারে, তাহলে আপনাকে একটি WorkManager কাজের সময় নির্ধারণ করতে হবে বা নীচের WakeLock নির্দেশিকা অনুসরণ করতে হবে। কিছু ক্ষেত্রে, OS বিলম্ব, অ্যাপ স্টার্টআপের সময়, অন্যান্য ক্রিয়াকলাপের দ্বারা ব্লক করা মূল থ্রেড, বা পূর্ববর্তী onMessageReceived
কলগুলি খুব বেশি সময় নেওয়া সহ onMessageReceived
এ কল করার আগে বিলম্বের উপর নির্ভর করে একটি বার্তা পরিচালনার জন্য সময় উইন্ডোটি 10 সেকেন্ডের কম হতে পারে৷ সেই টাইমারের মেয়াদ শেষ হওয়ার পরে, আপনার অ্যাপ প্রসেস কিলিং বা ব্যাকগ্রাউন্ড এক্সিকিউশন সীমার অধীন হতে পারে। মনে রাখবেন, নেটওয়ার্ক লেনদেন এবং অ্যাপ স্টার্টআপের জন্য বিলম্বগুলি উল্লেখযোগ্য হতে পারে, তাই সন্দেহ হলে, নেটওয়ার্ক অ্যাক্সেস বা নিবিড় ডেটা লোডিং প্রয়োজনীয়তার মতো কোনো অ্যাসিঙ্ক্রোনাস নির্ভরতা থাকলে আপনার বার্তা প্রক্রিয়াকরণ দীর্ঘমেয়াদী চালানোর জন্য পরিকল্পনা করুন।
অ্যাপ ম্যানিফেস্ট সম্পাদনা করুন
FirebaseMessagingService
ব্যবহার করতে, আপনাকে আপনার অ্যাপ ম্যানিফেস্টে নিম্নলিখিত যোগ করতে হবে:
<service android:name=".java.MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
এছাড়াও, বিজ্ঞপ্তিগুলির উপস্থিতি কাস্টমাইজ করতে আপনাকে ডিফল্ট মান সেট করার পরামর্শ দেওয়া হচ্ছে৷ আপনি একটি কাস্টম ডিফল্ট আইকন এবং একটি কাস্টম ডিফল্ট রঙ নির্দিষ্ট করতে পারেন যা যখনই বিজ্ঞপ্তি পেলোডে সমতুল্য মান সেট না করা হয় তখন প্রয়োগ করা হয়৷
কাস্টম ডিফল্ট আইকন এবং কাস্টম রঙ সেট করতে application
ট্যাগের ভিতরে এই লাইনগুলি যোগ করুন:
<!-- Set custom default icon. This is used when no icon is set for incoming notification messages. See README(https://goo.gl/l4GJaQ) for more. --> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_stat_ic_notification" /> <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming notification message. See README(https://goo.gl/6BKBk7) for more. --> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorAccent" />
Android এর জন্য কাস্টম ডিফল্ট আইকন প্রদর্শন করে
- বিজ্ঞপ্তি কম্পোজার থেকে পাঠানো সমস্ত বিজ্ঞপ্তি বার্তা।
- কোনো বিজ্ঞপ্তি বার্তা যা স্পষ্টভাবে বিজ্ঞপ্তি পেলোডে আইকন সেট করে না।
অ্যান্ড্রয়েড এর জন্য কাস্টম ডিফল্ট রঙ ব্যবহার করে
- বিজ্ঞপ্তি কম্পোজার থেকে পাঠানো সমস্ত বিজ্ঞপ্তি বার্তা।
- কোনো বিজ্ঞপ্তি বার্তা যা স্পষ্টভাবে বিজ্ঞপ্তি পেলোডে রঙ সেট করে না।
যদি কোনো কাস্টম ডিফল্ট আইকন সেট করা না থাকে এবং বিজ্ঞপ্তি পেলোডে কোনো আইকন সেট করা না থাকে, তাহলে Android সাদা রঙে রেন্ডার করা অ্যাপ্লিকেশন আইকন প্রদর্শন করে।
ওভাররাইড onMessageReceived
FirebaseMessagingService.onMessageReceived
পদ্ধতিটি ওভাররাইড করে, আপনি প্রাপ্ত RemoteMessage অবজেক্টের উপর ভিত্তি করে ক্রিয়া সম্পাদন করতে পারেন এবং বার্তা ডেটা পেতে পারেন:
Kotlin
override fun onMessageReceived(remoteMessage: RemoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: ${remoteMessage.from}") // Check if message contains a data payload. if (remoteMessage.data.isNotEmpty()) { Log.d(TAG, "Message data payload: ${remoteMessage.data}") // Check if data needs to be processed by long running job if (needsToBeScheduled()) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob() } else { // Handle message within 10 seconds handleNow() } } // Check if message contains a notification payload. remoteMessage.notification?.let { Log.d(TAG, "Message Notification Body: ${it.body}") } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
Java
@Override public void onMessageReceived(RemoteMessage remoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob(); } else { // Handle message within 10 seconds handleNow(); } } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
FCM বার্তাগুলি পরিচালনা করার সময় ডিভাইসটিকে জাগ্রত রাখুন৷
যদি আপনার অ্যাপটিকে একটি FCM বার্তা প্রক্রিয়া করার সময় ডিভাইসটিকে জাগ্রত রাখতে হয়, তাহলে এই সময়ের মধ্যে এটিকে একটি WakeLock ধরে রাখতে হবে বা এটি একটি WorkManager কাজ তৈরি করতে হবে। WakeLocks সংক্ষিপ্ত প্রক্রিয়াকরণ ক্রিয়াকলাপগুলির জন্য ভাল কাজ করে যা onMessageReceived
ডিফল্ট সময়সীমা অতিক্রম করতে পারে। বর্ধিত কর্মপ্রবাহের জন্য, যেমন আপনার সার্ভারে একাধিক সিরিয়াল RPC পাঠানো, একটি ওয়ার্ক ম্যানেজার কাজ ব্যবহার করা একটি WakeLock এর চেয়ে বেশি উপযুক্ত। এই বিভাগে আমরা কিভাবে WakeLocks ব্যবহার করতে হয় তার উপর ফোকাস করি। আপনার অ্যাপ চলার সময় একটি ওয়েকলক ডিভাইসটিকে ঘুমাতে বাধা দেয়, যার ফলে ব্যাটারি ব্যবহার বৃদ্ধি পেতে পারে, তাই বার্তা পরিচালনা করার সময় আপনার অ্যাপটি পজ করা উচিত নয় এমন ক্ষেত্রে WakeLocks ব্যবহার করা উচিত যেমন:
- ব্যবহারকারীর কাছে বিজ্ঞপ্তি যা সময় সংবেদনশীল।
- ডিভাইসের বাইরে এমন কিছুর সাথে মিথস্ক্রিয়া যা বাধা দেওয়া উচিত নয় (যেমন নেটওয়ার্ক স্থানান্তর বা অন্য ডিভাইসের সাথে যোগাযোগ, যেমন একটি জোড়া ঘড়ি)।
প্রথমে আপনাকে নিশ্চিত করতে হবে যে আপনার অ্যাপটি WakeLock অনুমতির জন্য অনুরোধ করছে (FCM SDK ডিফল্টরূপে এটি অন্তর্ভুক্ত করে, তাই সাধারণত কিছুই যোগ করার দরকার নেই)।
<uses-permission android:name="android.permission.WAKE_LOCK" />
তারপর আপনার অ্যাপটিকে FirebaseMessagingService.onMessageReceived()
কলব্যাকের শুরুতে একটি WakeLock অর্জন করতে হবে এবং কলব্যাকের শেষে এটি ছেড়ে দিতে হবে।
অ্যাপের কাস্টম FirebaseMessagingService
:
@Override public void onMessageReceived(final RemoteMessage message) { // If this is a message that is time sensitive or shouldn't be interrupted WakeLock wakeLock = getSystemService(PowerManager.class).newWakeLock(PARTIAL_WAKE_LOCK, "myApp:messageReceived"); try { wakeLock.acquire(TIMEOUT_MS); // handle message ... finally { wakeLock.release(); } }
onDeletedMessages
ওভাররাইড করুন
কিছু পরিস্থিতিতে, FCM একটি বার্তা প্রদান করতে পারে না। এটি তখন ঘটে যখন একটি নির্দিষ্ট ডিভাইসে সংযোগের সময় আপনার অ্যাপের জন্য অনেকগুলি বার্তা (>100) মুলতুবি থাকে বা যদি ডিভাইসটি এক মাসের বেশি সময় ধরে FCM সাথে সংযুক্ত না থাকে। এই ক্ষেত্রে, আপনি FirebaseMessagingService.onDeletedMessages()
এ একটি কলব্যাক পেতে পারেন যখন অ্যাপ ইনস্ট্যান্স এই কলব্যাকটি পায়, তখন এটি আপনার অ্যাপ সার্ভারের সাথে একটি সম্পূর্ণ সিঙ্ক সঞ্চালন করবে। আপনি যদি গত 4 সপ্তাহের মধ্যে সেই ডিভাইসে অ্যাপটিতে একটি বার্তা না পাঠিয়ে থাকেন, তাহলে FCM onDeletedMessages()
কল করবে না।একটি ব্যাকগ্রাউন্ডেড অ্যাপে বিজ্ঞপ্তি বার্তা পরিচালনা করুন
যখন আপনার অ্যাপটি ব্যাকগ্রাউন্ডে থাকে, তখন Android সিস্টেম ট্রেতে বিজ্ঞপ্তি বার্তা পাঠায়। বিজ্ঞপ্তিতে একটি ব্যবহারকারীর ট্যাপ ডিফল্টরূপে অ্যাপ লঞ্চারটি খোলে।
এতে বিজ্ঞপ্তি এবং ডেটা পেলোড (এবং বিজ্ঞপ্তি কনসোল থেকে পাঠানো সমস্ত বার্তা) উভয়ই রয়েছে এমন বার্তাগুলি অন্তর্ভুক্ত করে৷ এই ক্ষেত্রে, বিজ্ঞপ্তিটি ডিভাইসের সিস্টেম ট্রেতে বিতরণ করা হয়, এবং ডেটা পেলোড আপনার লঞ্চার কার্যকলাপের অভিপ্রায়ের অতিরিক্ত হিসাবে বিতরণ করা হয়।
আপনার অ্যাপে বার্তা বিতরণের অন্তর্দৃষ্টির জন্য, FCM রিপোর্টিং ড্যাশবোর্ড দেখুন, যা অ্যাপল এবং অ্যান্ড্রয়েড ডিভাইসে পাঠানো এবং খোলা বার্তাগুলির সংখ্যা রেকর্ড করে, সাথে Android অ্যাপগুলির জন্য "ইম্প্রেশন" (ব্যবহারকারীরা দেখেছে বিজ্ঞপ্তিগুলি) ডেটা সহ।
সরাসরি বুট মোডে FCM বার্তা গ্রহণ করুন
ডেভেলপাররা যারা ডিভাইসটি আনলক হওয়ার আগেই অ্যাপগুলিতে FCM বার্তা পাঠাতে চান তারা ডিভাইসটি সরাসরি বুট মোডে থাকা অবস্থায় একটি Android অ্যাপকে বার্তা পেতে সক্ষম করতে পারেন। উদাহরণস্বরূপ, আপনি আপনার অ্যাপের ব্যবহারকারীরা এমনকি একটি লক করা ডিভাইসেও অ্যালার্ম বিজ্ঞপ্তি পেতে চাইতে পারেন।
এই ব্যবহারের ক্ষেত্রে তৈরি করার সময়, সরাসরি বুট মোডের জন্য সাধারণ সর্বোত্তম অনুশীলন এবং বিধিনিষেধগুলি পর্যবেক্ষণ করুন। সরাসরি বুট-সক্রিয় বার্তাগুলির দৃশ্যমানতা বিবেচনা করা বিশেষভাবে গুরুত্বপূর্ণ; ডিভাইসে অ্যাক্সেস সহ যে কোনও ব্যবহারকারী ব্যবহারকারীর শংসাপত্রগুলি প্রবেশ না করেই এই বার্তাগুলি দেখতে পারেন।
পূর্বশর্ত
- ডিভাইসটি সরাসরি বুট মোডের জন্য সেট আপ করা আবশ্যক।
- ডিভাইসটিতে অবশ্যই Google Play পরিষেবাগুলির একটি সাম্প্রতিক সংস্করণ ইনস্টল থাকতে হবে (19.0.54 বা তার পরে)।
- FCM বার্তাগুলি পেতে অ্যাপটিকে অবশ্যই FCM SDK (
com.google.firebase:firebase-messaging
) ব্যবহার করতে হবে৷
আপনার অ্যাপে সরাসরি বুট মোড বার্তা পরিচালনা সক্ষম করুন
অ্যাপ-লেভেল গ্রেডল ফাইলে, FCM ডাইরেক্ট বুট সাপোর্ট লাইব্রেরির উপর নির্ভরতা যোগ করুন:
implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
অ্যাপ ম্যানিফেস্টে
android:directBootAware="true"
অ্যাট্রিবিউট যোগ করে অ্যাপেরFirebaseMessagingService
ডাইরেক্ট বুট সচেতন করুন:<service android:name=".java.MyFirebaseMessagingService" android:exported="false" android:directBootAware="true"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
এই FirebaseMessagingService
সরাসরি বুট মোডে চলতে পারে তা নিশ্চিত করা গুরুত্বপূর্ণ। নিম্নলিখিত প্রয়োজনীয়তা জন্য পরীক্ষা করুন:
- ডাইরেক্ট বুট মোডে চলাকালীন পরিষেবাটির শংসাপত্র সুরক্ষিত স্টোরেজ অ্যাক্সেস করা উচিত নয়।
- পরিষেবাটির উপাদানগুলি ব্যবহার করার চেষ্টা করা উচিত নয়, যেমন
Activities
,BroadcastReceivers
, বা অন্যServices
যা সরাসরি বুট মোডে চলাকালীন সরাসরি বুট সচেতন হিসাবে চিহ্নিত করা হয় না৷ - পরিষেবা ব্যবহার করে এমন কোনও লাইব্রেরিগুলিকে অবশ্যই শংসাপত্রের সুরক্ষিত স্টোরেজ অ্যাক্সেস করতে হবে না বা সরাসরি বুট মোডে চলাকালীন অ-ডাইরেক্ট বুটঅ্যায়ার উপাদানগুলিকে কল করতে হবে না। এর মানে হল যে অ্যাপটি ব্যবহার করে এমন যেকোন লাইব্রেরিগুলিকে পরিষেবা থেকে কল করা হয় সরাসরি বুট সচেতন হতে হবে, অথবা অ্যাপটিকে সরাসরি বুট মোডে চলছে কিনা তা পরীক্ষা করতে হবে এবং সেগুলিকে সেই মোডে কল করতে হবে না। উদাহরণস্বরূপ, Firebase SDK গুলি সরাসরি বুটের সাথে কাজ করে (এগুলি সরাসরি বুট মোডে ক্র্যাশ না করে একটি অ্যাপে অন্তর্ভুক্ত করা যেতে পারে), কিন্তু অনেক Firebase API সরাসরি বুট মোডে কল করা সমর্থন করে না।
- যদি অ্যাপটি একটি কাস্টম
Application
ব্যবহার করে, তবেApplication
সরাসরি বুট সচেতন হতে হবে (সরাসরি বুট মোডে শংসাপত্র সুরক্ষিত স্টোরেজে কোনও অ্যাক্সেস নেই)।
সরাসরি বুট মোডে ডিভাইসে বার্তা পাঠানোর বিষয়ে নির্দেশনার জন্য, সরাসরি বুট-সক্ষম বার্তা পাঠান দেখুন।