একাধিক ডিভাইসে বার্তা পাঠান

একাধিক ডিভাইসে একটি বার্তা লক্ষ্য করতে, টপিক মেসেজিং ব্যবহার করুন। এই বৈশিষ্ট্যটি আপনাকে একাধিক ডিভাইসে একটি বার্তা পাঠাতে দেয় যারা একটি নির্দিষ্ট বিষয়ে নির্বাচন করেছে।

এই টিউটোরিয়ালটি FCM জন্য Admin SDK অথবা REST API ব্যবহার করে আপনার অ্যাপ সার্ভার থেকে বিষয়ভিত্তিক বার্তা পাঠানো এবং একটি অ্যান্ড্রয়েড অ্যাপে সেগুলি গ্রহণ এবং পরিচালনা করার উপর আলোকপাত করে। আমরা ব্যাকগ্রাউন্ড এবং ফোরগ্রাউন্ড উভয় অ্যাপের জন্য বার্তা পরিচালনা সম্পর্কে আলোচনা করব। এটি অর্জনের জন্য সেটআপ থেকে যাচাইকরণ পর্যন্ত সমস্ত পদক্ষেপ কভার করা হয়েছে।

SDK সেট আপ করুন

এই বিভাগে আপনি যদি FCM জন্য একটি Android ক্লায়েন্ট অ্যাপ সেট আপ করে থাকেন অথবা আপনার প্রথম বার্তা পাঠানোর ধাপগুলি সম্পন্ন করে থাকেন, তাহলে আপনি ইতিমধ্যেই যে ধাপগুলি সম্পন্ন করেছেন সেগুলি অন্তর্ভুক্ত থাকতে পারে।

শুরু করার আগে

  • অ্যান্ড্রয়েড স্টুডিওকে তার সর্বশেষ সংস্করণে ইনস্টল বা আপডেট করুন।

  • নিশ্চিত করুন যে আপনার প্রকল্পটি এই প্রয়োজনীয়তাগুলি পূরণ করে (মনে রাখবেন যে কিছু পণ্যের কঠোর প্রয়োজনীয়তা থাকতে পারে):

    • API লেভেল ২১ (ললিপপ) বা তার বেশি লক্ষ্য করে
    • অ্যান্ড্রয়েড ৫.০ বা তার উচ্চতর সংস্করণ ব্যবহার করে
    • Jetpack (AndroidX) ব্যবহার করে, যার মধ্যে এই সংস্করণের প্রয়োজনীয়তাগুলি পূরণ করা অন্তর্ভুক্ত:
      • com.android.tools.build:gradle v7.3.0 বা তার পরবর্তী সংস্করণ
      • compileSdkVersion 28 বা তার পরবর্তী সংস্করণ
  • আপনার অ্যাপটি চালানোর জন্য একটি ফিজিক্যাল ডিভাইস সেট আপ করুন অথবা একটি এমুলেটর ব্যবহার করুন।
    মনে রাখবেন যে Google Play পরিষেবার উপর নির্ভরশীল Firebase SDK গুলির জন্য ডিভাইস বা এমুলেটরে Google Play পরিষেবা ইনস্টল করা প্রয়োজন।

  • আপনার গুগল অ্যাকাউন্ট ব্যবহার করে ফায়ারবেসে সাইন ইন করুন

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

একটি ফায়ারবেস প্রকল্প তৈরি করুন

আপনার অ্যান্ড্রয়েড অ্যাপে Firebase যোগ করার আগে, আপনার অ্যান্ড্রয়েড অ্যাপের সাথে সংযোগ স্থাপনের জন্য আপনাকে একটি Firebase প্রকল্প তৈরি করতে হবে। Firebase প্রকল্প সম্পর্কে আরও জানতে Understand Firebase প্রকল্পগুলি দেখুন।

Firebase-এ আপনার অ্যাপ নিবন্ধন করুন

আপনার অ্যান্ড্রয়েড অ্যাপে Firebase ব্যবহার করার জন্য, আপনাকে আপনার Firebase প্রোজেক্টের সাথে আপনার অ্যাপটি নিবন্ধন করতে হবে। আপনার অ্যাপটি নিবন্ধন করাকে প্রায়শই আপনার প্রোজেক্টে আপনার অ্যাপটি "যোগ করা" বলা হয়।

  1. Firebase কনসোলে যান।

  2. প্রজেক্ট ওভারভিউ পৃষ্ঠার মাঝখানে, সেটআপ ওয়ার্কফ্লো চালু করতে অ্যান্ড্রয়েড আইকন ( ) অথবা অ্যাপ যোগ করুন- এ ক্লিক করুন।

  3. অ্যান্ড্রয়েড প্যাকেজ নাম ক্ষেত্রে আপনার অ্যাপের প্যাকেজের নাম লিখুন।

  4. (ঐচ্ছিক) একটি অ্যাপ ডাকনাম লিখুন, যা একটি অভ্যন্তরীণ, সুবিধাজনক শনাক্তকারী যা শুধুমাত্র Firebase কনসোলে আপনার কাছে দৃশ্যমান।

  5. অ্যাপ নিবন্ধন করুন এ ক্লিক করুন।

একটি Firebase কনফিগারেশন ফাইল যোগ করুন

  1. ডাউনলোড করুন এবং তারপর আপনার কোডবেসে আপনার অ্যাপের Firebase কনফিগারেশন ফাইল ( google-services.json ) যোগ করুন:

    1. আপনার অ্যাপের Firebase কনফিগারেশন ফাইলটি পেতে Download google-services.json এ ক্লিক করুন।

    2. আপনার অ্যাপের মডিউল (অ্যাপ-লেভেল) রুট ডিরেক্টরিতে আপনার কনফিগার ফাইলটি সরান।

  2. আপনার google-services.json কনফিগারেশন ফাইলের মানগুলিকে Firebase SDK-তে অ্যাক্সেসযোগ্য করতে, আপনার Google services Gradle প্লাগইন ( google-services ) প্রয়োজন।

    1. আপনার রুট-লেভেল (প্রজেক্ট-লেভেল) গ্র্যাডেল ফাইলে ( <project>/build.gradle.kts অথবা <project>/build.gradle ), নির্ভরতা হিসেবে Google পরিষেবা প্লাগইন যোগ করুন:

      Kotlin

      plugins {
        id("com.android.application") version "7.3.0" apply false
        // ...
      
        // Add the dependency for the Google services Gradle plugin
        id("com.google.gms.google-services") version "4.4.4" apply false
      }

      Groovy

      plugins {
        id 'com.android.application' version '7.3.0' apply false
        // ...
      
        // Add the dependency for the Google services Gradle plugin
        id 'com.google.gms.google-services' version '4.4.4' apply false
      }
    2. আপনার মডিউল (অ্যাপ-লেভেল) গ্র্যাডেল ফাইলে (সাধারণত <project>/<app-module>/build.gradle.kts অথবা <project>/<app-module>/build.gradle ), Google services প্লাগইন যোগ করুন:

      Kotlin

      plugins {
        id("com.android.application")
      
        // Add the Google services Gradle plugin
        id("com.google.gms.google-services")
        // ...
      }

      Groovy

      plugins {
        id 'com.android.application'
      
        // Add the Google services Gradle plugin
        id 'com.google.gms.google-services'
        // ...
      }

আপনার অ্যাপে Firebase SDK যোগ করুন

  1. আপনার মডিউল (অ্যাপ-লেভেল) গ্র্যাডেল ফাইলে (সাধারণত <project>/<app-module>/build.gradle.kts অথবা <project>/<app-module>/build.gradle ), Android এর জন্য Firebase Cloud Messaging লাইব্রেরির জন্য নির্ভরতা যোগ করুন। লাইব্রেরি সংস্করণ নিয়ন্ত্রণ করতে আমরা Firebase Android BoM ব্যবহার করার পরামর্শ দিই।

    Firebase Cloud Messaging এর সর্বোত্তম অভিজ্ঞতার জন্য, আমরা আপনার Firebase প্রকল্পে Google Analytics সক্ষম করার এবং আপনার অ্যাপে Google Analytics এর জন্য Firebase SDK যোগ করার পরামর্শ দিচ্ছি।

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:34.4.0"))
    
        // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-messaging")
        implementation("com.google.firebase:firebase-analytics")
    }

    Firebase Android BoM ব্যবহার করে, আপনার অ্যাপ সর্বদা Firebase Android লাইব্রেরির সামঞ্জস্যপূর্ণ সংস্করণ ব্যবহার করবে।

    (বিকল্প) BoM ব্যবহার না করেই Firebase লাইব্রেরি নির্ভরতা যোগ করুন

    যদি আপনি Firebase BoM ব্যবহার না করার সিদ্ধান্ত নেন, তাহলে আপনাকে প্রতিটি Firebase লাইব্রেরি সংস্করণ তার নির্ভরতা লাইনে নির্দিষ্ট করতে হবে।

    মনে রাখবেন যে আপনি যদি আপনার অ্যাপে একাধিক Firebase লাইব্রেরি ব্যবহার করেন, তাহলে আমরা দৃঢ়ভাবে লাইব্রেরি সংস্করণগুলি পরিচালনা করার জন্য BoM ব্যবহার করার পরামর্শ দিচ্ছি, যা নিশ্চিত করে যে সমস্ত সংস্করণ সামঞ্জস্যপূর্ণ।

    dependencies {
        // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-messaging:25.0.1")
        implementation("com.google.firebase:firebase-analytics:23.0.0")
    }

  2. আপনার অ্যান্ড্রয়েড প্রজেক্টটি গ্র্যাডেল ফাইলের সাথে সিঙ্ক করুন।

ক্লায়েন্ট অ্যাপটিকে একটি বিষয়ে সাবস্ক্রাইব করুন

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

কোনও টপিকে সাবস্ক্রাইব করার জন্য, ক্লায়েন্ট অ্যাপটি Firebase Cloud Messaging subscribeToTopic() FCM টপিক নাম দিয়ে কল করে। এই পদ্ধতিটি একটি Task প্রদান করে, যা একজন সমাপ্তি শ্রোতা দ্বারা সাবস্ক্রিপশন সফল হয়েছে কিনা তা নির্ধারণ করতে ব্যবহার করা যেতে পারে:

Kotlin

Firebase.messaging.subscribeToTopic("weather")
    .addOnCompleteListener { task ->
        var msg = "Subscribed"
        if (!task.isSuccessful) {
            msg = "Subscribe failed"
        }
        Log.d(TAG, msg)
        Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
    }

Java

FirebaseMessaging.getInstance().subscribeToTopic("weather")
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                String msg = "Subscribed";
                if (!task.isSuccessful()) {
                    msg = "Subscribe failed";
                }
                Log.d(TAG, msg);
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });

আনসাবস্ক্রাইব করার জন্য, ক্লায়েন্ট অ্যাপটি টপিকের নাম দিয়ে Firebase Cloud Messaging unsubscribeFromTopic() কল করে।

বিষয়ভিত্তিক বার্তা গ্রহণ এবং পরিচালনা করা

FCM অন্যান্য ডাউনস্ট্রিম বার্তাগুলির মতোই বিষয়ভিত্তিক বার্তা সরবরাহ করে।

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

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

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

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

সংক্ষেপে:

অ্যাপের অবস্থা বিজ্ঞপ্তি উপাত্ত উভয়ই
অগ্রভাগ onMessageReceived onMessageReceived onMessageReceived
পটভূমি সিস্টেম ট্রে onMessageReceived বিজ্ঞপ্তি: সিস্টেম ট্রে
তথ্য: অভিপ্রায়ের অতিরিক্ত অংশে।
বার্তার ধরণ সম্পর্কে আরও তথ্যের জন্য, বিজ্ঞপ্তি এবং ডেটা বার্তা দেখুন।

onMessageReceived কলব্যাকের সময়সীমা নির্ধারিত থাকে যা আপনাকে কেবল একটি বিজ্ঞপ্তি পোস্ট করতে সক্ষম করে কিন্তু টাইমারগুলি অ্যাপটিকে নেটওয়ার্ক অ্যাক্সেস করতে বা অতিরিক্ত কাজ করার অনুমতি দেওয়ার জন্য ডিজাইন করা হয়নি। অতএব, যদি আপনার অ্যাপটি আরও জটিল কিছু করে, তাহলে অ্যাপটি তার কাজ সম্পূর্ণ করতে পারে তা নিশ্চিত করার জন্য আপনাকে অতিরিক্ত কাজ করতে হবে।

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

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

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

FCM বার্তা পরিচালনা করার সময় ডিভাইসটি জাগ্রত রাখুন

যদি আপনার অ্যাপটিকে FCM মেসেজ প্রসেস করার সময় ডিভাইসটিকে জাগ্রত রাখতে হয়, তাহলে এই সময়কালে এটিকে একটি WakeLock ধরে রাখতে হবে অথবা একটি WorkManager জব তৈরি করতে হবে। WakeLocks ছোট প্রক্রিয়াকরণ কার্যকলাপের জন্য ভালো কাজ করে যা onMessageReceived ডিফল্ট টাইমআউট অতিক্রম করতে পারে। বর্ধিত কর্মপ্রবাহের জন্য, যেমন আপনার সার্ভারে একাধিক সিরিয়াল RPC পাঠানো, WakeLock এর চেয়ে WorkManager জব ব্যবহার করা বেশি উপযুক্ত। এই বিভাগে আমরা WakeLocks কীভাবে ব্যবহার করবেন তার উপর আলোকপাত করব। WakeLock আপনার অ্যাপ চলাকালীন ডিভাইসটিকে স্লিপ হতে বাধা দেয়, যার ফলে ব্যাটারির ব্যবহার বৃদ্ধি পেতে পারে, তাই 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() এ কল করবে না।

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

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

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

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

পাঠানোর অনুরোধ তৈরি করুন

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

ব্যাকএন্ডে আপনার সেন্ডিং লজিকে, দেখানো হিসাবে পছন্দসই বিষয়ের নাম উল্লেখ করুন:

নোড.জেএস

// The topic name can be optionally prefixed with "/topics/".
const topic = 'highScores';

const message = {
  data: {
    score: '850',
    time: '2:45'
  },
  topic: topic
};

// Send a message to devices subscribed to the provided topic.
getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

জাভা

// The topic name can be optionally prefixed with "/topics/".
String topic = "highScores";

// See documentation on defining a message payload.
Message message = Message.builder()
    .putData("score", "850")
    .putData("time", "2:45")
    .setTopic(topic)
    .build();

// Send a message to the devices subscribed to the provided topic.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);

পাইথন

# The topic name can be optionally prefixed with "/topics/".
topic = 'highScores'

# See documentation on defining a message payload.
message = messaging.Message(
    data={
        'score': '850',
        'time': '2:45',
    },
    topic=topic,
)

# Send a message to the devices subscribed to the provided topic.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)

যাও

// The topic name can be optionally prefixed with "/topics/".
topic := "highScores"

// See documentation on defining a message payload.
message := &messaging.Message{
	Data: map[string]string{
		"score": "850",
		"time":  "2:45",
	},
	Topic: topic,
}

// Send a message to the devices subscribed to the provided topic.
response, err := client.Send(ctx, message)
if err != nil {
	log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)

সি#

// The topic name can be optionally prefixed with "/topics/".
var topic = "highScores";

// See documentation on defining a message payload.
var message = new Message()
{
    Data = new Dictionary<string, string>()
    {
        { "score", "850" },
        { "time", "2:45" },
    },
    Topic = topic,
};

// Send a message to the devices subscribed to the provided topic.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);

বিশ্রাম

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
  "message":{
    "topic" : "foo-bar",
    "notification" : {
      "body" : "This is a Firebase Cloud Messaging Topic Message!",
      "title" : "FCM Message"
      }
   }
}

cURL কমান্ড:

curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
  "message": {
    "topic" : "foo-bar",
    "notification": {
      "body": "This is a Firebase Cloud Messaging Topic Message!",
      "title": "FCM Message"
    }
  }
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

বিভিন্ন বিষয়ের সংমিশ্রণে বার্তা পাঠাতে, একটি শর্ত উল্লেখ করুন, যা একটি বুলিয়ান এক্সপ্রেশন যা লক্ষ্য বিষয়গুলি নির্দিষ্ট করে। উদাহরণস্বরূপ, নিম্নলিখিত শর্তটি TopicA এবং TopicB অথবা TopicC তে সাবস্ক্রাইব করা ডিভাইসগুলিতে বার্তা পাঠাবে:

"'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"

FCM প্রথমে বন্ধনীতে যেকোনো শর্ত মূল্যায়ন করে, এবং তারপর বাম থেকে ডানে এক্সপ্রেশনটি মূল্যায়ন করে। উপরের এক্সপ্রেশনে, যে ব্যবহারকারী কোনও একক বিষয়ে সাবস্ক্রাইব করেছেন তিনি বার্তাটি পান না। একইভাবে, যে ব্যবহারকারী TopicA তে সাবস্ক্রাইব করেন না তিনি বার্তাটি পান না। এই সমন্বয়গুলি এটি গ্রহণ করে:

  • TopicA এবং TopicB
  • TopicA এবং TopicC

আপনার শর্তসাপেক্ষ অভিব্যক্তিতে আপনি সর্বোচ্চ পাঁচটি বিষয় অন্তর্ভুক্ত করতে পারেন।

একটি শর্তে পাঠাতে:

নোড.জেএস

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
const condition = '\'stock-GOOG\' in topics || \'industry-tech\' in topics';

// See documentation on defining a message payload.
const message = {
  notification: {
    title: '$FooCorp up 1.43% on the day',
    body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
  },
  condition: condition
};

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

জাভা

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
String condition = "'stock-GOOG' in topics || 'industry-tech' in topics";

// See documentation on defining a message payload.
Message message = Message.builder()
    .setNotification(Notification.builder()
        .setTitle("$GOOG up 1.43% on the day")
        .setBody("$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.")
        .build())
    .setCondition(condition)
    .build();

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);

পাইথন

# Define a condition which will send to devices which are subscribed
# to either the Google stock or the tech industry topics.
condition = "'stock-GOOG' in topics || 'industry-tech' in topics"

# See documentation on defining a message payload.
message = messaging.Message(
    notification=messaging.Notification(
        title='$GOOG up 1.43% on the day',
        body='$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.',
    ),
    condition=condition,
)

# Send a message to devices subscribed to the combination of topics
# specified by the provided condition.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)

যাও

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
condition := "'stock-GOOG' in topics || 'industry-tech' in topics"

// See documentation on defining a message payload.
message := &messaging.Message{
	Data: map[string]string{
		"score": "850",
		"time":  "2:45",
	},
	Condition: condition,
}

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
response, err := client.Send(ctx, message)
if err != nil {
	log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)

সি#

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
var condition = "'stock-GOOG' in topics || 'industry-tech' in topics";

// See documentation on defining a message payload.
var message = new Message()
{
    Notification = new Notification()
    {
        Title = "$GOOG up 1.43% on the day",
        Body = "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.",
    },
    Condition = condition,
};

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);

বিশ্রাম

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
   "message":{
    "condition": "'dogs' in topics || 'cats' in topics",
    "notification" : {
      "body" : "This is a Firebase Cloud Messaging Topic Message!",
      "title" : "FCM Message",
    }
  }
}

cURL কমান্ড:

curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
  "notification": {
    "title": "FCM Message",
    "body": "This is a Firebase Cloud Messaging Topic Message!",
  },
  "condition": "'dogs' in topics || 'cats' in topics"
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

পরবর্তী পদক্ষেপ