Firebase ক্লাউড মেসেজিং ব্যবহার করে বার্তা গ্রহণ করুন

এই নির্দেশিকাটি বর্ণনা করে কিভাবে আপনার মোবাইল এবং ওয়েব ক্লায়েন্ট অ্যাপগুলিতে Firebase Cloud Messaging সেট আপ করবেন যাতে আপনি নির্ভরযোগ্যভাবে বার্তা গ্রহণ করতে পারেন।

বার্তা গ্রহণের জন্য, আপনি এমন একটি পরিষেবা ব্যবহার করতে পারেন যা FirebaseMessagingService প্রসারিত করে। আপনার পরিষেবাটি onMessageReceived এবং onDeletedMessages কলব্যাকগুলিকে ওভাররাইড করবে। একটি সম্পূর্ণ উদাহরণের জন্য, Firebase Cloud Messaging quickstart নমুনা দেখুন।

onMessageReceived বেশিরভাগ বার্তার ধরণের জন্য প্রদান করা হয়, নিম্নলিখিত ব্যতিক্রমগুলি ছাড়া:

  • আপনার অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন বিজ্ঞপ্তি বার্তাগুলি সরবরাহ করা হয় । এই ক্ষেত্রে, বিজ্ঞপ্তিটি ডিভাইসের সিস্টেম ট্রেতে সরবরাহ করা হয়। ব্যবহারকারী কোনও বিজ্ঞপ্তিতে ট্যাপ করলে ডিফল্টরূপে অ্যাপ লঞ্চারটি খোলে।

  • ব্যাকগ্রাউন্ডে প্রাপ্ত বার্তাগুলিতে বিজ্ঞপ্তি এবং ডেটা পেলোড উভয়ই থাকে । এই ক্ষেত্রে, বিজ্ঞপ্তিটি ডিভাইসের সিস্টেম ট্রেতে পৌঁছে দেওয়া হয় এবং ডেটা পেলোডটি আপনার লঞ্চার অ্যাক্টিভিটির উদ্দেশ্য অনুসারে অতিরিক্তভাবে সরবরাহ করা হয়।

সংক্ষেপে:

অ্যাপের অবস্থা বিজ্ঞপ্তি উপাত্ত উভয়ই
অগ্রভাগ onMessageReceived onMessageReceived onMessageReceived
পটভূমি সিস্টেম ট্রে onMessageReceived বিজ্ঞপ্তি: সিস্টেম ট্রে ডেটা: উদ্দেশ্যের অতিরিক্ত অংশে।

বার্তার ধরণ সম্পর্কে আরও তথ্যের জন্য, বিজ্ঞপ্তি এবং ডেটা বার্তা দেখুন।

onMessageReceived কলব্যাকের একটি ছোট এক্সিকিউশন উইন্ডো থাকে। এই উইন্ডোটির দৈর্ঘ্য অনেকগুলি কারণের উপর নির্ভর করতে পারে, যার মধ্যে রয়েছে OS বিলম্ব, অ্যাপ শুরু হওয়ার সময়, অন্যান্য ক্রিয়াকলাপ দ্বারা মূল থ্রেড ব্লক করা, অথবা পূর্ববর্তী onMessageReceived কলগুলি খুব বেশি সময় নেয়।

এই কারণে, onMessageReceived এ আপনার দীর্ঘমেয়াদী কাজগুলি (যেমন একটি সার্ভার থেকে একটি বিজ্ঞপ্তিতে প্রদর্শনের জন্য ছবি আনা) এড়ানো উচিত এবং পরিবর্তে WorkManager ব্যবহার করে একটি কাজ নির্ধারণ করা উচিত যাতে এমন কোনও কাজ সম্পন্ন হতে কয়েক সেকেন্ডের বেশি সময় লাগতে পারে। বার্তার অগ্রাধিকার এবং এটি প্রক্রিয়াকরণকে কীভাবে প্রভাবিত করে সে সম্পর্কে আরও তথ্যের জন্য, উচ্চ এবং স্বাভাবিক অগ্রাধিকার বার্তাগুলির জন্য বার্তা প্রক্রিয়াকরণ দেখুন।

অ্যাপ ম্যানিফেস্ট সম্পাদনা করুন

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" />

অ্যান্ড্রয়েড কাস্টম ডিফল্ট আইকন প্রদর্শন করে এবং ব্যবহার করে

  • বিজ্ঞপ্তি কম্পোজার থেকে পাঠানো সমস্ত বিজ্ঞপ্তি বার্তা।
  • যেকোনো বিজ্ঞপ্তি বার্তা যা বিজ্ঞপ্তি পেলোডে আইকনটি স্পষ্টভাবে সেট করে না।

যদি একটি কাস্টম ডিফল্ট আইকন সেট না করা থাকে এবং বিজ্ঞপ্তি পেলোডে একটি আইকন সেট না করা থাকে, তাহলে অ্যান্ড্রয়েড সাদা রঙে রেন্ডার করা অ্যাপ্লিকেশন আইকনটি প্রদর্শন করে।

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.
}

onDeletedMessages ওভাররাইড করুন

কিছু পরিস্থিতিতে, FCM কোনও বার্তা নাও পাঠাতে পারে। এটি তখন ঘটে যখন কোনও নির্দিষ্ট ডিভাইসে সংযোগ করার সময় আপনার অ্যাপের জন্য অনেকগুলি বার্তা (>100) পেন্ডিং থাকে অথবা যদি ডিভাইসটি এক মাসেরও বেশি সময় ধরে FCM সাথে সংযুক্ত না থাকে। এই ক্ষেত্রে, আপনি FirebaseMessagingService.onDeletedMessages() এ একটি কলব্যাক পেতে পারেন। যখন অ্যাপ ইনস্ট্যান্সটি এই কলব্যাকটি গ্রহণ করে, তখন এটি আপনার অ্যাপ সার্ভারের সাথে সম্পূর্ণ সিঙ্ক করবে। যদি আপনি গত 4 সপ্তাহের মধ্যে সেই ডিভাইসে অ্যাপটিতে কোনও বার্তা না পাঠান, তাহলে FCM onDeletedMessages() এ কল করবে না।

ব্যাকগ্রাউন্ডেড অ্যাপে বিজ্ঞপ্তি বার্তা পরিচালনা করুন

যখন আপনার অ্যাপটি ব্যাকগ্রাউন্ডে থাকে, তখন অ্যান্ড্রয়েড সিস্টেম ট্রেতে বিজ্ঞপ্তি বার্তা পাঠায়। ব্যবহারকারীর নোটিফিকেশনে ট্যাপ করলে ডিফল্টভাবে অ্যাপ লঞ্চারটি খুলে যায়।

এর মধ্যে এমন বার্তা অন্তর্ভুক্ত থাকে যাতে বিজ্ঞপ্তি এবং ডেটা পেলোড উভয়ই থাকে (এবং বিজ্ঞপ্তি কনসোল থেকে প্রেরিত সমস্ত বার্তা)। এই ক্ষেত্রে, বিজ্ঞপ্তিটি ডিভাইসের সিস্টেম ট্রেতে পৌঁছে দেওয়া হয় এবং ডেটা পেলোডটি আপনার লঞ্চার অ্যাক্টিভিটির উদ্দেশ্যের অতিরিক্ত অংশে পৌঁছে দেওয়া হয়।

আপনার অ্যাপে বার্তা সরবরাহ সম্পর্কে আরও তথ্যের জন্য, FCM রিপোর্টিং ড্যাশবোর্ড দেখুন, যা অ্যাপল এবং অ্যান্ড্রয়েড ডিভাইসে প্রেরিত এবং খোলা বার্তার সংখ্যা রেকর্ড করে, সাথে অ্যান্ড্রয়েড অ্যাপের জন্য "ইমপ্রেশন" (ব্যবহারকারীদের দ্বারা দেখা বিজ্ঞপ্তি) এর ডেটাও রেকর্ড করে।