Android এ একটি Firebase ক্লাউড মেসেজিং ক্লায়েন্ট অ্যাপ সেট আপ করুন

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

SDK সেট আপ করুন

আপনি যদি ইতিমধ্যে আপনার অ্যাপের জন্য অন্যান্য Firebase বৈশিষ্ট্যগুলি সক্ষম করে থাকেন তবে এই বিভাগে আপনি যে কাজগুলি সম্পন্ন করেছেন তা কভার করে৷ যদি আপনি ইতিমধ্যে না করে থাকেন, তাহলে আপনার Android প্রকল্পে Firebase যোগ করুন

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

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

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

Android 13 বিজ্ঞপ্তি দেখানোর জন্য একটি নতুন রানটাইম অনুমতি প্রবর্তন করেছে। এটি Android 13 বা উচ্চতর সংস্করণে চলমান সমস্ত অ্যাপকে প্রভাবিত করে যেগুলি FCM বিজ্ঞপ্তিগুলি ব্যবহার করে৷

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

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

Kotlin+KTX

// 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 ব্যবহারকারীকে সম্মত বা অস্বীকার করার বিকল্পগুলি প্রদান করা উচিত, যেমন ঠিক আছে এবং না ধন্যবাদ বোতাম৷ ব্যবহারকারী ঠিক আছে নির্বাচন করলে, সরাসরি অনুমতির জন্য অনুরোধ করুন। ব্যবহারকারী যদি না ধন্যবাদ নির্বাচন করে, ব্যবহারকারীকে বিজ্ঞপ্তি ছাড়াই চালিয়ে যাওয়ার অনুমতি দিন।

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

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

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

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

ঐচ্ছিক: 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+KTX

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+KTX

/**
 * 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);
}

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

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

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

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

স্বয়ংক্রিয় সূচনা প্রতিরোধ করুন

যখন একটি FCM রেজিস্ট্রেশন টোকেন তৈরি হয়, তখন লাইব্রেরি শনাক্তকারী এবং কনফিগারেশন ডেটা Firebase-এ আপলোড করে। আপনি যদি টোকেন অটোজেনারেশন প্রতিরোধ করতে চান, তাহলে আপনার AndroidManifest.xml এ এই মেটাডেটা মানগুলি যোগ করে অ্যানালিটিক্স সংগ্রহ এবং 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 অটো-ইনিট পুনরায় সক্ষম করতে, একটি রানটাইম কল করুন:

Kotlin+KTX

Firebase.messaging.isAutoInitEnabled = true

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

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

setAnalyticsCollectionEnabled(true);

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

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

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

আপনার অ্যাপে অন্যান্য, আরও উন্নত আচরণ যোগ করতে, আপনি একটি অভিপ্রায় ফিল্টার ঘোষণা করতে পারেন এবং আগত বার্তাগুলির প্রতিক্রিয়া জানাতে একটি কার্যকলাপ বাস্তবায়ন করতে পারেন। বিস্তারিত জানার জন্য, একটি অ্যাপ সার্ভার থেকে বার্তা পাঠানোর জন্য গাইড দেখুন:

মনে রাখবেন যে, এই বৈশিষ্ট্যগুলির সুবিধা নিতে, আপনাকে একটি সার্ভার বাস্তবায়ন এবং সার্ভার প্রোকোটল (HTTP বা XMPP), অথবা অ্যাডমিন SDK- এর একটি বাস্তবায়নের প্রয়োজন হবে।