Android ऐप्लिकेशन में Firebase Cloud Messaging का इस्तेमाल शुरू करना

प्लैटफ़ॉर्म चुनें: iOS+ Android Web Flutter Unity C++


इस गाइड में, Firebase Cloud Messaging का इस्तेमाल शुरू करने का तरीका बताया गया है, ताकि भरोसेमंद तरीके से मैसेज भेजे जा सकें.

FCM क्लाइंट के लिए, Android 6.0 या इसके बाद के वर्शन वाले ऐसे डिवाइस ज़रूरी हैं जिनमें Google Play Store ऐप्लिकेशन इंस्टॉल हो. इसके अलावा, Android 6.0 वाले ऐसे एम्युलेटर का इस्तेमाल किया जा सकता है जिसमें Google APIs मौजूद हों. ध्यान दें कि Android ऐप्लिकेशन को सिर्फ़ Google Play Store के ज़रिए डिप्लॉय करने की ज़रूरत नहीं है.

SDK टूल सेट अप करना

अगर आपने पहले से ही A/B टेस्टिंग नहीं बनाई है, तो अपने Android प्रोजेक्ट में Firebase जोड़ें.

हमारा सुझाव है कि FCM के साथ बेहतर अनुभव पाने के लिए, अपने प्रोजेक्ट में सुविधा चालू करेंGoogle Analytics. Google Analytics की FCM के लिए मैसेज डिलीवरी रिपोर्टिंग ज़रूरी है.

अपने ऐप्लिकेशन का मेनिफ़ेस्ट में बदलाव करना

अपने ऐप्लिकेशन के मेनिफ़ेस्ट में यह जानकारी जोड़ें:

Android 13 या इसके बाद के वर्शन पर, रनटाइम सूचना की अनुमति का अनुरोध करना

Android 13 में, सूचनाएं दिखाने के लिए एक नई रनटाइम अनुमति की सुविधा जोड़ी गई है. इसका असर 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);
        }
    }
}

आम तौर पर, आपको एक ऐसा यूज़र इंटरफ़ेस (यूआई) दिखाना चाहिए जिसमें उपयोगकर्ता को उन सुविधाओं के बारे में बताया गया हो जो ऐप्लिकेशन को सूचनाएं पोस्ट करने की अनुमति देने पर चालू हो जाएंगी. इस यूज़र इंटरफ़ेस (यूआई) में, उपयोगकर्ता को सहमति देने या अनुमति न देने के विकल्प मिलने चाहिए. जैसे, ठीक है और नहीं, धन्यवाद बटन. अगर उपयोगकर्ता ठीक है चुनता है, तो सीधे अनुमति का अनुरोध करें. अगर उपयोगकर्ता नहीं, धन्यवाद चुनता है, तो उसे सूचनाएं न मिलने पर भी ऐप्लिकेशन का इस्तेमाल जारी रखने की अनुमति दें.

ज़्यादा जानकारी के लिए, सूचना की रनटाइम अनुमति लेख पढ़ें. इसमें, यह बताया गया है कि आपके ऐप्लिकेशन को उपयोगकर्ता से POST_NOTIFICATIONS अनुमति का अनुरोध कब करना चाहिए.

Android 12L (एपीआई लेवल 32) या इससे पहले के लेवल को टारगेट करने वाले ऐप्लिकेशन के लिए, सूचना की अनुमतियां

जब आपका ऐप्लिकेशन पहली बार कोई सूचना चैनल बनाता है, तब Android अपने-आप उपयोगकर्ता से अनुमति मांगता है. हालांकि, इसके लिए ज़रूरी है कि ऐप्लिकेशन फ़ोरग्राउंड में चल रहा हो. हालांकि, चैनल बनाने और अनुमति के अनुरोधों के समय के बारे में कुछ ज़रूरी चेतावनियां हैं:

  • अगर आपका ऐप्लिकेशन बैकग्राउंड में चल रहा है और इस दौरान वह अपना पहला सूचना चैनल बनाता है, तो Android सूचना नहीं दिखाएगा. साथ ही, उपयोगकर्ता से सूचना की अनुमति के लिए तब तक नहीं पूछेगा, जब तक आपका ऐप्लिकेशन अगली बार नहीं खोला जाता. FCM SDK, FCM सूचना पाने पर ऐसा करता है. इसका मतलब है कि आपका ऐप्लिकेशन खोले जाने और उपयोगकर्ता के अनुमति स्वीकार करने से पहले मिली सूचनाएं खो जाएंगी.
  • हमारा सुझाव है कि अनुमति का अनुरोध करने के लिए, प्लैटफ़ॉर्म के एपीआई का फ़ायदा पाने के लिए, अपने ऐप्लिकेशन को Android 13 या इसके बाद के वर्शन को टारगेट करने के लिए अपडेट करें. अगर ऐसा नहीं किया जा सकता, तो आपके ऐप्लिकेशन को सूचनाएं भेजने से पहले, सूचना चैनल बनाने चाहिए. इससे सूचना की अनुमति का डायलॉग ट्रिगर होगा और यह पक्का किया जा सकेगा कि कोई सूचना न खोई हो. ज़्यादा जानकारी के लिए, सूचना की अनुमति के सबसे सही तरीके देखें.

ज़रूरी नहीं: POST_NOTIFICATIONS अनुमति हटाना

डिफ़ॉल्ट रूप से, FCM SDK में POST_NOTIFICATIONS अनुमति शामिल होती है. अगर आपका ऐप्लिकेशन सूचना वाले मैसेज नहीं भेजता है (चाहे FCM सूचनाओं के ज़रिए, किसी अन्य SDK टूल के ज़रिए या सीधे आपके ऐप्लिकेशन से पोस्ट किए गए मैसेज) और आपको अपने ऐप्लिकेशन में यह अनुमति शामिल नहीं करनी है, तो मेनिफ़ेस्ट मर्जर के marker remove का इस्तेमाल करके, इसे हटाया जा सकता है. ध्यान रखें कि इस अनुमति को हटाने से, सभी सूचनाएं दिखनी बंद हो जाती हैं. सिर्फ़ FCM सूचनाएं नहीं. अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में यह जानकारी जोड़ें:

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

FCM रजिस्ट्रेशन टोकन ऐक्सेस करना

आपका ऐप्लिकेशन पहली बार शुरू होने पर, 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);
}

टोकन पाने के बाद, इसे अपने ऐप्लिकेशन सर्वर पर भेजा जा सकता है और अपनी पसंद के तरीके से सेव किया जा सकता है.

Google Play services की जांच करना

Play Services SDK टूल पर निर्भर रहने वाले ऐप्लिकेशन को, Google Play services की सुविधाओं को ऐक्सेस करने से पहले, हमेशा डिवाइस पर Google Play services के साथ काम करने वाले APK की जांच करनी चाहिए. ज़्यादा जानने के लिए, Google Play services सेट अप करना लेख पढ़ें. हमारा सुझाव है कि यह जांच दो जगहों पर की जाए: मुख्य गतिविधि के onCreate() तरीके में और उसके onResume() तरीके में. onCreate() में की गई जांच से यह पक्का होता है कि बिना जांच किए ऐप्लिकेशन का इस्तेमाल न किया जा सके. onResume() में की गई जांच से यह पक्का होता है कि अगर उपयोगकर्ता किसी अन्य तरीके से चल रहे ऐप्लिकेशन पर वापस आता है, जैसे कि बैक बटन के ज़रिए, तो भी जांच की जाती है.

अगर डिवाइस में Google Play services का ऐसा वर्शन नहीं है जो आपके ऐप्लिकेशन के साथ काम करता है, तो आपका ऐप्लिकेशनGoogleApiAvailability.makeGooglePlayServicesAvailable() को कॉल कर सकता है. इससे उपयोगकर्ताओं को Play Store से Google Play services डाउनलोड करने की अनुमति मिलेगी.

अपने-आप शुरू होने की सुविधा को रोकना

जब एक FCM रजिस्ट्रेशन टोकन जनरेट होता है, तो लाइब्रेरी आइडेंटिफ़ायर और कॉन्फ़िगरेशन डेटा को Firebase पर अपलोड करती है. अगर आपको टोकन के अपने-आप जनरेट होने की सुविधा को रोकना है, तो Analytics कलेक्शन और FCM के अपने-आप शुरू होने की सुविधा को बंद करें. इसके लिए, आपको अपने AndroidManifest.xml में ये मेटाडेटा वैल्यू जोड़नी होंगी. ध्यान रखें कि आपको दोनों सुविधाएं बंद करनी होंगी:

<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

Firebase.messaging.isAutoInitEnabled = true

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

Analytics कलेक्शन को फिर से चालू करने के लिए, setAnalyticsCollectionEnabled() क्लास के FirebaseAnalytics तरीके को कॉल करें. उदाहरण के लिए:

setAnalyticsCollectionEnabled(true);

ये वैल्यू सेट होने के बाद, ऐप्लिकेशन को रीस्टार्ट करने पर भी बनी रहती हैं.

सूचना वाला मैसेज भेजना

यह पक्का करने के लिए कि आपका Android क्लाइंट सही तरीके से सेट अप किया गया है, यहां दिए गए निर्देशों का इस्तेमाल करके, टेस्ट सूचना वाला मैसेज भेजा जा सकता है:

  1. टारगेट डिवाइस पर ऐप्लिकेशन इंस्टॉल करें और उसे चलाएं.
  2. पक्का करें कि डिवाइस पर ऐप्लिकेशन बैकग्राउंड में चल रहा हो.
  3. Firebase कंसोल में, मैसेज भेजने की सुविधा वाला पेज खोलें.
  4. अगर यह आपका पहला मैसेज है, तो अपना पहला कैंपेन बनाएं, Firebase सूचना वाले मैसेज को चुनें. इसके बाद, बनाएं को चुनें.
  5. अगर यह आपका पहला मैसेज नहीं है, तो कैंपेन टैब पर, नया कैंपेन को चुनें. इसके बाद, सूचनाएं को चुनें.
  6. मैसेज का टेक्स्ट डालें. अन्य सभी फ़ील्ड ज़रूरी नहीं हैं.
  7. दाईं ओर मौजूद पैनल में, टेस्ट मैसेज भेजें को चुनें.
  8. FCM रजिस्ट्रेशन टोकन जोड़ें लेबल वाले फ़ील्ड में, वह रजिस्ट्रेशन टोकन डालें जो आपने इस गाइड के पिछले सेक्शन में पाया था.
  9. टेस्ट को चुनें.

टारगेट किए गए क्लाइंट डिवाइस को सूचना मिलनी चाहिए. इस दौरान, ऐप्लिकेशन बैकग्राउंड में चल रहा होना चाहिए.

अपने ऐप्लिकेशन पर मैसेज डिलीवरी के बारे में ज़्यादा जानने के लिए, FCM रिपोर्टिंग डैशबोर्ड देखें, इसमें Apple और Android डिवाइसों पर भेजे गए और खोले गए मैसेज की संख्या रिकॉर्ड की जाती है. साथ ही, Android ऐप्लिकेशन के लिए इंप्रेशन (उपयोगकर्ताओं को दिखने वाली सूचनाएं) का डेटा भी रिकॉर्ड किया जाता है.

अगले चरण

सेटअप के चरण पूरे करने के बाद, Android के लिए FCM का इस्तेमाल जारी रखने के कुछ विकल्प यहां दिए गए हैं: