Firebase ক্লাউড মেসেজিং দিয়ে শুরু করুন


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

Firebase Cloud Messaging এবং অ্যান্ড্রয়েড দিয়ে শুরু করা

FCM ক্লায়েন্টদের জন্য Android 5.0 বা তার পরবর্তী ভার্সন চালিত ডিভাইস প্রয়োজন যার মধ্যে Google Play Store অ্যাপ ইনস্টল করা আছে, অথবা Google API সহ Android 5.0 চালিত এমুলেটর প্রয়োজন। মনে রাখবেন যে আপনি Google Play Store এর মাধ্যমে আপনার Android অ্যাপগুলি স্থাপন করতে সীমাবদ্ধ নন।

SDK সেটআপ করুন

যদি আপনি ইতিমধ্যেই না করে থাকেন, তাহলে আপনার অ্যান্ড্রয়েড প্রজেক্টে Firebase যোগ করুন

FCM সাথে সর্বোত্তম অভিজ্ঞতার জন্য, আমরা দৃঢ়ভাবে আপনার প্রকল্পে Google Analytics সক্ষম করার পরামর্শ দিচ্ছি। FCM এর বার্তা বিতরণ প্রতিবেদনের জন্য Google Analytics একটি প্রয়োজনীয়তা।

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

আপনার অ্যাপের ম্যানিফেস্টে নিম্নলিখিতগুলি যোগ করুন:

  • একটি পরিষেবা যা FirebaseMessagingService প্রসারিত করে। ব্যাকগ্রাউন্ডে অ্যাপগুলিতে বিজ্ঞপ্তি গ্রহণের বাইরে অন্য কোনও বার্তা পরিচালনা করতে চাইলে এটি প্রয়োজন। ফোরগ্রাউন্ড অ্যাপগুলিতে বিজ্ঞপ্তি গ্রহণ করতে, ডেটা পেলোড গ্রহণ করতে এবং আরও অনেক কিছু করতে, আপনাকে এই পরিষেবাটি প্রসারিত করতে হবে।
  • <service
        android:name=".java.MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
  • (ঐচ্ছিক) অ্যাপ্লিকেশন কম্পোনেন্টের মধ্যে, মেটাডেটা উপাদানগুলি একটি ডিফল্ট বিজ্ঞপ্তি আইকন এবং রঙ সেট করতে পারে। যখনই আগত বার্তাগুলি স্পষ্টভাবে আইকন বা রঙ সেট না করে তখন অ্যান্ড্রয়েড এই মানগুলি ব্যবহার করে।
  • <!-- 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 8.0 (API লেভেল 26) এবং উচ্চতর সংস্করণ থেকে, বিজ্ঞপ্তি চ্যানেলগুলি সমর্থিত এবং সুপারিশ করা হয়। FCM মৌলিক সেটিংস সহ একটি ডিফল্ট বিজ্ঞপ্তি চ্যানেল প্রদান করে। আপনি যদি আপনার নিজস্ব ডিফল্ট চ্যানেল তৈরি এবং ব্যবহার করতে চান, তাহলে দেখানো হিসাবে আপনার বিজ্ঞপ্তি চ্যানেল অবজেক্টের ID তে default_notification_channel_id সেট করুন; যখনই আগত বার্তাগুলি স্পষ্টভাবে একটি বিজ্ঞপ্তি চ্যানেল সেট না করে তখন FCM এই মানটি ব্যবহার করবে। আরও জানতে, বিজ্ঞপ্তি চ্যানেল পরিচালনা করুন দেখুন।
  • <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />

Android 13+ এ রানটাইম বিজ্ঞপ্তির অনুমতির অনুরোধ করুন

অ্যান্ড্রয়েড ১৩ নোটিফিকেশন দেখানোর জন্য একটি নতুন রানটাইম অনুমতি চালু করেছে। এটি অ্যান্ড্রয়েড ১৩ বা তার উচ্চতর ভার্সনে চলমান সমস্ত অ্যাপকে প্রভাবিত করে যারা FCM নোটিফিকেশন ব্যবহার করে।

ডিফল্টরূপে, FCM SDK (সংস্করণ 23.0.6 বা উচ্চতর) ম্যানিফেস্টে সংজ্ঞায়িত POST_NOTIFICATIONS অনুমতি অন্তর্ভুক্ত করে। তবে, আপনার অ্যাপটিকে ধ্রুবক, android.permission.POST_NOTIFICATIONS ব্যবহার করে এই অনুমতির রানটাইম সংস্করণের জন্য অনুরোধ করতে হবে। ব্যবহারকারী এই অনুমতি না দেওয়া পর্যন্ত আপনার অ্যাপটি বিজ্ঞপ্তি দেখানোর অনুমতি পাবে না।

নতুন রানটাইম অনুমতির জন্য অনুরোধ করতে:

Kotlin

// Declare the launcher at the top of your Activity/Fragment:
private val requestPermissionLauncher = registerForActivityResult(
    ActivityResultContracts.RequestPermission(),
) { isGranted: Boolean ->
    if (isGranted) {
        // FCM SDK (and your app) can post notifications.
    } else {
        // TODO: Inform user that that your app will not show notifications.
    }
}

private fun askNotificationPermission() {
    // This is only necessary for API level >= 33 (TIRAMISU)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
            PackageManager.PERMISSION_GRANTED
        ) {
            // FCM SDK (and your app) can post notifications.
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
            // TODO: display an educational UI explaining to the user the features that will be enabled
            //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
            //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
            //       If the user selects "No thanks," allow the user to continue without notifications.
        } else {
            // Directly ask for the permission
            requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
        }
    }
}

Java

// Declare the launcher at the top of your Activity/Fragment:
private final ActivityResultLauncher<String> requestPermissionLauncher =
        registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
            if (isGranted) {
                // FCM SDK (and your app) can post notifications.
            } else {
                // TODO: Inform user that that your app will not show notifications.
            }
        });

private void askNotificationPermission() {
    // This is only necessary for API level >= 33 (TIRAMISU)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
                PackageManager.PERMISSION_GRANTED) {
            // FCM SDK (and your app) can post notifications.
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
            // TODO: display an educational UI explaining to the user the features that will be enabled
            //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
            //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
            //       If the user selects "No thanks," allow the user to continue without notifications.
        } else {
            // Directly ask for the permission
            requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
        }
    }
}

সাধারণত, আপনার একটি UI প্রদর্শন করা উচিত যা ব্যবহারকারীকে ব্যাখ্যা করে যে অ্যাপটি যদি বিজ্ঞপ্তি পোস্ট করার অনুমতি দেয় তবে কোন বৈশিষ্ট্যগুলি সক্রিয় করা হবে। এই UI ব্যবহারকারীকে সম্মতি বা অস্বীকার করার বিকল্পগুলি প্রদান করবে, যেমন OK এবং No thanks বোতাম। ব্যবহারকারী যদি OK নির্বাচন করেন, তাহলে সরাসরি অনুমতির জন্য অনুরোধ করুন। ব্যবহারকারী যদি No thanks নির্বাচন করেন, তাহলে ব্যবহারকারীকে বিজ্ঞপ্তি ছাড়াই চালিয়ে যাওয়ার অনুমতি দিন।

আপনার অ্যাপ কখন ব্যবহারকারীর কাছ থেকে POST_NOTIFICATIONS অনুমতির অনুরোধ করবে সে সম্পর্কে আরও সেরা অনুশীলনের জন্য বিজ্ঞপ্তি রানটাইম অনুমতি দেখুন।

Android 12L (API লেভেল 32) বা তার নিচের ভার্সনগুলিকে লক্ষ্য করে অ্যাপগুলির জন্য বিজ্ঞপ্তির অনুমতি

আপনার অ্যাপটি যখন প্রথমবার নোটিফিকেশন চ্যানেল তৈরি করে তখন অ্যান্ড্রয়েড স্বয়ংক্রিয়ভাবে ব্যবহারকারীর কাছ থেকে অনুমতি চায়, যতক্ষণ না অ্যাপটি সামনের দিকে থাকে। তবে, চ্যানেল তৈরির সময় এবং অনুমতির অনুরোধ সম্পর্কে গুরুত্বপূর্ণ সতর্কতা রয়েছে:

  • যদি আপনার অ্যাপটি ব্যাকগ্রাউন্ডে চলার সময় তার প্রথম নোটিফিকেশন চ্যানেল তৈরি করে, যা FCM SDK FCM নোটিফিকেশন পাওয়ার সময় করে, তাহলে Android বিজ্ঞপ্তিটি প্রদর্শনের অনুমতি দেবে না এবং পরবর্তী সময় আপনার অ্যাপটি খোলার আগে ব্যবহারকারীকে বিজ্ঞপ্তির অনুমতির জন্য অনুরোধ করবে না। এর অর্থ হল আপনার অ্যাপটি খোলার আগে এবং ব্যবহারকারী অনুমতি গ্রহণ করার আগে প্রাপ্ত যেকোনো বিজ্ঞপ্তি হারিয়ে যাবে।
  • আমরা দৃঢ়ভাবে সুপারিশ করছি যে আপনি আপনার অ্যাপটি Android 13+ টার্গেট করে আপডেট করুন যাতে প্ল্যাটফর্মের API গুলি ব্যবহার করে অনুমতির অনুরোধ করতে পারেন। যদি তা সম্ভব না হয়, তাহলে অ্যাপে কোনও বিজ্ঞপ্তি পাঠানোর আগে আপনার অ্যাপের বিজ্ঞপ্তি চ্যানেল তৈরি করা উচিত যাতে বিজ্ঞপ্তি অনুমতি ডায়ালগটি ট্রিগার করা যায় এবং নিশ্চিত করা যায় যে কোনও বিজ্ঞপ্তি হারিয়ে না যায়। আরও তথ্যের জন্য বিজ্ঞপ্তি অনুমতির সেরা অনুশীলনগুলি দেখুন।

ঐচ্ছিক: POST_NOTIFICATIONS অনুমতি সরান

ডিফল্টরূপে, FCM SDK-তে POST_NOTIFICATIONS অনুমতি অন্তর্ভুক্ত থাকে। যদি আপনার অ্যাপ বিজ্ঞপ্তি বার্তা ব্যবহার না করে ( FCM বিজ্ঞপ্তির মাধ্যমে, অন্য SDK-এর মাধ্যমে, অথবা সরাসরি আপনার অ্যাপ দ্বারা পোস্ট করা) এবং আপনি চান না যে আপনার অ্যাপটি অনুমতি অন্তর্ভুক্ত করুক, তাহলে আপনি ম্যানিফেস্ট মার্জারের remove মার্কার ব্যবহার করে এটি সরিয়ে ফেলতে পারেন। মনে রাখবেন যে এই অনুমতি অপসারণ করলে কেবল FCM বিজ্ঞপ্তি নয়, সমস্ত বিজ্ঞপ্তি প্রদর্শিত হবে। আপনার অ্যাপের ম্যানিফেস্ট ফাইলে নিম্নলিখিতটি যোগ করুন:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" tools:node="remove"/>

ডিভাইস নিবন্ধন টোকেন অ্যাক্সেস করুন

আপনার অ্যাপের প্রাথমিক স্টার্টআপে, FCM SDK ক্লায়েন্ট অ্যাপ ইনস্ট্যান্সের জন্য একটি রেজিস্ট্রেশন টোকেন তৈরি করে। আপনি যদি একক ডিভাইসকে টার্গেট করতে চান বা ডিভাইস গ্রুপ তৈরি করতে চান, তাহলে আপনাকে FirebaseMessagingService এক্সটেন্ড করে এবং onNewToken ওভাররাইড করে এই টোকেনটি অ্যাক্সেস করতে হবে। যেহেতু প্রাথমিক স্টার্টআপের পরে টোকেনটি ঘোরানো যেতে পারে, তাই আপনাকে সর্বশেষ আপডেট করা রেজিস্ট্রেশন টোকেনটি পুনরুদ্ধার করার জন্য দৃঢ়ভাবে সুপারিশ করা হচ্ছে।

রেজিস্ট্রেশন টোকেন পরিবর্তন হতে পারে যখন:

  • অ্যাপটি একটি নতুন ডিভাইসে পুনরুদ্ধার করা হয়েছে
  • ব্যবহারকারী অ্যাপটি আনইনস্টল/পুনরায় ইনস্টল করেন
  • ব্যবহারকারী অ্যাপ ডেটা সাফ করে।

বর্তমান নিবন্ধন টোকেনটি পুনরুদ্ধার করুন

যখন আপনার বর্তমান টোকেনটি পুনরুদ্ধার করার প্রয়োজন হবে, FirebaseMessaging.getInstance().getToken() এ কল করুন:

Kotlin

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w(TAG, "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }

    // Get new FCM registration token
    val token = task.result

    // Log and toast
    val msg = getString(R.string.msg_token_fmt, token)
    Log.d(TAG, msg)
    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})

Java

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

টোকেন জেনারেশন মনিটর করুন

যখনই একটি নতুন টোকেন তৈরি হয় তখন onNewToken কলব্যাক চালু হয়।

Kotlin

/**
 * 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.
    sendRegistrationToServer(token)
}

Java

/**
 * There are two scenarios when onNewToken is called:
 * 1) When a new token is generated on initial app startup
 * 2) Whenever an existing token is changed
 * Under #2, there are three scenarios when the existing token is changed:
 * A) App is restored to a new device
 * B) User uninstalls/reinstalls the app
 * C) User clears app data
 */
@Override
public void onNewToken(@NonNull String token) {
    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.
    sendRegistrationToServer(token);
}

টোকেনটি পাওয়ার পর, আপনি এটি আপনার অ্যাপ সার্ভারে পাঠাতে পারেন এবং আপনার পছন্দের পদ্ধতি ব্যবহার করে এটি সংরক্ষণ করতে পারেন।

গুগল প্লে পরিষেবাগুলি পরীক্ষা করুন

যেসব অ্যাপ Play Services SDK-এর উপর নির্ভর করে, তাদের Google Play পরিষেবার বৈশিষ্ট্যগুলি অ্যাক্সেস করার আগে সর্বদা ডিভাইসটিতে একটি সামঞ্জস্যপূর্ণ Google Play পরিষেবার APK আছে কিনা তা পরীক্ষা করা উচিত। আরও জানতে, Google Play পরিষেবা সেট আপ দেখুন। এটি দুটি জায়গায় করার পরামর্শ দেওয়া হয়: প্রধান কার্যকলাপের onCreate() পদ্ধতিতে এবং এর onResume() পদ্ধতিতে। onCreate() চেক ইন নিশ্চিত করে যে অ্যাপটি সফলভাবে পরীক্ষা না করে ব্যবহার করা যাবে না। onResume() চেক ইন নিশ্চিত করে যে ব্যবহারকারী যদি অন্য কোনও উপায়ে, যেমন ব্যাক বোতামের মাধ্যমে, চলমান অ্যাপে ফিরে আসে, তবে চেকটি এখনও সম্পন্ন হয়।

যদি ডিভাইসটিতে Google Play পরিষেবার কোনও সামঞ্জস্যপূর্ণ সংস্করণ না থাকে, তাহলে আপনার অ্যাপটি GoogleApiAvailability.makeGooglePlayServicesAvailable() কল করে ব্যবহারকারীদের Play Store থেকে Google Play পরিষেবা ডাউনলোড করার অনুমতি দিতে পারে।

স্বয়ংক্রিয় আরম্ভ রোধ করুন

যখন একটি FCM রেজিস্ট্রেশন টোকেন তৈরি করা হয়, তখন লাইব্রেরি Firebase-এ শনাক্তকারী এবং কনফিগারেশন ডেটা আপলোড করে। আপনি যদি টোকেন স্বয়ংক্রিয়ভাবে তৈরি হওয়া রোধ করতে চান, তাহলে আপনার AndroidManifest.xml এ এই মেটাডেটা মানগুলি যোগ করে Analytics সংগ্রহ এবং FCM স্বয়ংক্রিয় শুরুকরণ (উভয়ই অক্ষম করতে হবে) অক্ষম করুন:

<meta-data
    android:name="firebase_messaging_auto_init_enabled"
    android:value="false" />
<meta-data
    android:name="firebase_analytics_collection_enabled"
    android:value="false" />

FCM auto-init পুনরায় সক্ষম করতে, একটি রানটাইম কল করুন:

Kotlin

Firebase.messaging.isAutoInitEnabled = true

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

Analytics সংগ্রহ পুনরায় সক্ষম করতে, FirebaseAnalytics ক্লাসের setAnalyticsCollectionEnabled() পদ্ধতিটি কল করুন। উদাহরণস্বরূপ:

setAnalyticsCollectionEnabled(true);

একবার সেট করা হলে অ্যাপ রিস্টার্ট জুড়ে এই মানগুলি বজায় থাকে।

একটি বিজ্ঞপ্তি বার্তা পাঠান

আপনার অ্যান্ড্রয়েড ক্লায়েন্ট সঠিকভাবে সেটআপ করা আছে কিনা তা নিশ্চিত করতে, আপনি নিম্নলিখিত নির্দেশাবলী ব্যবহার করে একটি পরীক্ষামূলক বিজ্ঞপ্তি বার্তা পাঠাতে পারেন:

  1. টার্গেট ডিভাইসে অ্যাপটি ইনস্টল করুন এবং চালান।
  2. নিশ্চিত করুন যে অ্যাপটি ডিভাইসের ব্যাকগ্রাউন্ডে চলছে।
  3. Firebase কনসোলে, মেসেজিং পৃষ্ঠাটি খুলুন।
  4. যদি এটি আপনার প্রথম বার্তা হয়, তাহলে আপনার প্রথম প্রচারণা তৈরি করুন , Firebase বিজ্ঞপ্তি বার্তা নির্বাচন করুন এবং তারপর তৈরি করুন
  5. অন্যথায়, প্রচারণা ট্যাবে, নতুন প্রচারণা এবং তারপর বিজ্ঞপ্তি নির্বাচন করুন।
  6. বার্তার টেক্সট লিখুন। অন্যান্য সকল ক্ষেত্র ঐচ্ছিক।
  7. ডান ফলক থেকে পরীক্ষামূলক বার্তা পাঠান নির্বাচন করুন।
  8. "একটি FCM নিবন্ধন টোকেন যোগ করুন" লেবেলযুক্ত ক্ষেত্রে, এই নির্দেশিকার পূর্ববর্তী বিভাগে প্রাপ্ত নিবন্ধন টোকেনটি লিখুন।
  9. পরীক্ষা নির্বাচন করুন।

ব্যাকগ্রাউন্ডে থাকা অ্যাপটি সহ টার্গেট করা ক্লায়েন্ট ডিভাইসটি বিজ্ঞপ্তিটি পাবে।

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

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

সেটআপ ধাপগুলি সম্পন্ন করার পরে, Android এর জন্য FCM নিয়ে এগিয়ে যাওয়ার জন্য এখানে কয়েকটি বিকল্প রয়েছে: