एंड्रॉइड पर फायरबेस क्लाउड मैसेजिंग क्लाइंट ऐप सेट करें

एफसीएम क्लाइंट को एंड्रॉइड 4.4 या उच्चतर पर चलने वाले डिवाइस की आवश्यकता होती है जिसमें Google Play Store ऐप भी इंस्टॉल हो, या Google एपीआई के साथ एंड्रॉइड 4.4 पर चलने वाला एमुलेटर हो। ध्यान दें कि आप Google Play Store के माध्यम से अपने Android ऐप्स को तैनात करने तक ही सीमित नहीं हैं।

एसडीके सेट करें

यदि आपने पहले से ही अपने ऐप के लिए अन्य फायरबेस सुविधाओं को सक्षम कर लिया है तो यह अनुभाग आपके द्वारा पूरे किए जा सकने वाले कार्यों को शामिल करता है। यदि आपने पहले से नहीं किया है, तो अपने Android प्रोजेक्ट में Firebase जोड़ें

अपना ऐप मेनिफ़ेस्ट संपादित करें

अपने ऐप के मेनिफ़ेस्ट में निम्नलिखित जोड़ें:

  • एक सेवा जो 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" />
  • (वैकल्पिक) एंड्रॉइड 8.0 (एपीआई स्तर 26) और उच्चतर से, अधिसूचना चैनल समर्थित और अनुशंसित हैं। एफसीएम बुनियादी सेटिंग्स के साथ एक डिफ़ॉल्ट अधिसूचना चैनल प्रदान करता है। यदि आप अपना स्वयं का डिफ़ॉल्ट चैनल बनाना और उपयोग करना पसंद करते हैं, तो दिखाए गए अनुसार अपने अधिसूचना चैनल ऑब्जेक्ट की आईडी पर default_notification_channel_id सेट करें; जब भी आने वाले संदेश स्पष्ट रूप से अधिसूचना चैनल सेट नहीं करेंगे तो एफसीएम इस मान का उपयोग करेगा। अधिक जानने के लिए, अधिसूचना चैनल प्रबंधित करें देखें।
  • <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />

Android 13+ पर रनटाइम अधिसूचना अनुमति का अनुरोध करें

एंड्रॉइड 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);
        }
    }
}

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

आपके ऐप को उपयोगकर्ता से POST_NOTIFICATIONS अनुमति का अनुरोध कब करना चाहिए, इस पर अधिक सर्वोत्तम प्रथाओं के लिए अधिसूचना रनटाइम अनुमति देखें।

Android 12L (API स्तर 32) या उससे कम को लक्षित करने वाले ऐप्स के लिए अधिसूचना अनुमतियाँ

जब आपका ऐप पहली बार अधिसूचना चैनल बनाता है तो एंड्रॉइड स्वचालित रूप से उपयोगकर्ता से अनुमति मांगता है, जब तक ऐप अग्रभूमि में है। हालाँकि, चैनल निर्माण के समय और अनुमति अनुरोधों के संबंध में महत्वपूर्ण चेतावनियाँ हैं:

  • यदि आपका ऐप पृष्ठभूमि में चलने पर अपना पहला अधिसूचना चैनल बनाता है (जो एफसीएम एसडीके एफसीएम अधिसूचना प्राप्त करते समय करता है), एंड्रॉइड अधिसूचना को प्रदर्शित करने की अनुमति नहीं देगा और अगले तक अधिसूचना अनुमति के लिए उपयोगकर्ता को संकेत नहीं देगा आपका ऐप खुलने का समय. इसका मतलब यह है कि आपके ऐप को खोलने और उपयोगकर्ता द्वारा अनुमति स्वीकार करने से पहले प्राप्त कोई भी अधिसूचना खो जाएगी।
  • हम दृढ़ता से अनुशंसा करते हैं कि आप अनुमति का अनुरोध करने के लिए प्लेटफ़ॉर्म के एपीआई का लाभ उठाने के लिए अपने ऐप को एंड्रॉइड 13+ को लक्षित करने के लिए अपडेट करें। यदि यह संभव नहीं है, तो अधिसूचना अनुमति संवाद को ट्रिगर करने और यह सुनिश्चित करने के लिए कि कोई अधिसूचना खो न जाए, आपके ऐप को ऐप पर कोई भी अधिसूचना भेजने से पहले अधिसूचना चैनल बनाना चाहिए। अधिक जानकारी के लिए अधिसूचना अनुमति सर्वोत्तम प्रथाएँ देखें।

वैकल्पिक: POST_NOTIFICATIONS अनुमति हटाएँ

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

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

डिवाइस पंजीकरण टोकन तक पहुंचें

आपके ऐप के प्रारंभिक स्टार्टअप पर, एफसीएम एसडीके क्लाइंट ऐप इंस्टेंस के लिए एक पंजीकरण टोकन उत्पन्न करता है। यदि आप एकल डिवाइस को लक्षित करना चाहते हैं या डिवाइस समूह बनाना चाहते हैं, तो आपको 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 सेवाओं की जाँच करें

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

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

स्वतः आरंभीकरण रोकें

जब एफसीएम पंजीकरण टोकन उत्पन्न होता है, तो लाइब्रेरी पहचानकर्ता और कॉन्फ़िगरेशन डेटा को फायरबेस पर अपलोड करती है। यदि आप टोकन ऑटोजेनरेशन को रोकना पसंद करते हैं, तो इन मेटाडेटा मानों को अपने 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 के कार्यान्वयन की आवश्यकता होगी।