FCM क्लाइंट के लिए, Android 5.0 या इसके बाद के वर्शन वाले ऐसे डिवाइस ज़रूरी हैं जिन पर Google Play Store ऐप्लिकेशन इंस्टॉल हो. इसके अलावा, Android 5.0 पर काम करने वाला ऐसा एम्युलेटर भी इस्तेमाल किया जा सकता है जिसमें Google API मौजूद हों. ध्यान दें कि Android ऐप्लिकेशन को सिर्फ़ Google Play Store के ज़रिए ही डिप्लॉय नहीं किया जा सकता.
एसडीके टूल सेट अप करना
इस सेक्शन में उन कामों के बारे में बताया गया है जिन्हें आपने शायद पहले ही पूरा कर लिया हो. ऐसा तब होता है, जब आपने अपने ऐप्लिकेशन के लिए Firebase की अन्य सुविधाएं पहले ही चालू कर ली हों. अगर आपने ऐसा नहीं किया है, तो अपने Android प्रोजेक्ट में Firebase जोड़ें
अपने ऐप्लिकेशन मेनिफ़ेस्ट में बदलाव करना
अपने ऐप्लिकेशन के मेनिफ़ेस्ट में यह जोड़ें:
- ऐसी सेवा जो
FirebaseMessagingService
को बेहतर बनाती है. अगर आपको बैकग्राउंड में ऐप्लिकेशन पर सूचनाएं पाने के अलावा, मैसेज से जुड़ी कोई और कार्रवाई करनी है, तो यह ज़रूरी है. फ़ोरग्राउंड किए गए ऐप्लिकेशन में सूचनाएं पाने, डेटा पेलोड पाने वगैरह के लिए, आपको इस सेवा को बढ़ाना होगा. - (ज़रूरी नहीं) ऐप्लिकेशन कॉम्पोनेंट में, मेटाडेटा एलिमेंट का इस्तेमाल करके सूचना के डिफ़ॉल्ट आइकॉन और रंग को सेट किया जा सकता है. Android इन वैल्यू का इस्तेमाल तब करता है, जब आने वाले मैसेज में आइकॉन या रंग साफ़ तौर पर सेट न किया गया हो.
- (ज़रूरी नहीं) Android 8.0 (एपीआई लेवल 26) और इसके बाद के वर्शन में,
नोटिफ़िकेशन चैनल इस्तेमाल किए जा सकते हैं. हमारा सुझाव है कि आप इनका इस्तेमाल करें. FCM बुनियादी सेटिंग के साथ सूचना का डिफ़ॉल्ट चैनल उपलब्ध कराता है. अगर आपको अपना डिफ़ॉल्ट चैनल
बनाना और इस्तेमाल करना है, तो
default_notification_channel_id
को अपने सूचना चैनल ऑब्जेक्ट के आईडी पर सेट करें, जैसा कि दिखाया गया है. FCM इस वैल्यू का इस्तेमाल तब करेगा, जब आने वाले मैसेज में सूचना चैनल को साफ़ तौर पर सेट नहीं किया गया होगा. ज़्यादा जानने के लिए, सूचना चैनल मैनेज करना लेख पढ़ें.
<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" />
<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
// 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 अपने-आप उपयोगकर्ता से अनुमति मांगता है. ऐसा तब तक होता है, जब तक ऐप्लिकेशन फ़ोरग्राउंड में चालू रहता है. हालाँकि, चैनल बनाने और अनुमति के अनुरोधों के समय के बारे में कुछ ज़रूरी बातें हैं:
- अगर आपका ऐप्लिकेशन बैकग्राउंड में चलने के दौरान अपना पहला सूचना चैनल बनाता है (FCM SDK टूल, FCM सूचना मिलने पर ऐसा करता है), तो Android सूचना को दिखाने की अनुमति नहीं देगा. साथ ही, जब तक आपका ऐप्लिकेशन अगली बार नहीं खोला जाता, तब तक वह उपयोगकर्ता से सूचना की अनुमति नहीं मांगेगा. इसका मतलब है कि ऐप्लिकेशन खोलने से पहले और उपयोगकर्ता की अनुमति स्वीकार करने से पहले मिली सूचनाएं मिट जाएंगी.
- हमारा सुझाव है कि आप अपने ऐप्लिकेशन को 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
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 मौजूद है या नहीं. हमारा सुझाव है कि आप ऐसा दो जगहों पर करें: मुख्य गतिविधि के 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 डेटा कलेक्शन को फिर से चालू करने के लिए, FirebaseAnalytics
क्लास के setAnalyticsCollectionEnabled()
तरीके को कॉल करें. उदाहरण के लिए:
setAnalyticsCollectionEnabled(true);
एक बार सेट हो जाने के बाद, ऐप्लिकेशन को रीस्टार्ट करने पर भी ये वैल्यू बनी रहती हैं.
अगले चरण
क्लाइंट ऐप्लिकेशन सेट अप करने के बाद, सूचना कंपोज़र की मदद से डाउनस्ट्रीम मैसेज भेजे जा सकते हैं. इस सुविधा के बारे में क्विकस्टार्ट सैंपल में बताया गया है. इसे डाउनलोड, चलाया, और देखा जा सकता है.
अपने ऐप्लिकेशन में अन्य, ज़्यादा बेहतर सुविधाएं जोड़ने के लिए, इंटेंट फ़िल्टर का एलान किया जा सकता है. साथ ही, आने वाले मैसेज का जवाब देने के लिए गतिविधि लागू की जा सकती है. ज़्यादा जानकारी के लिए, ऐप्लिकेशन सर्वर से मैसेज भेजने से जुड़ी गाइड देखें:
ध्यान रखें कि इन सुविधाओं का फ़ायदा पाने के लिए, आपको सर्वर का इस्तेमाल करना होगा. साथ ही, सर्वर प्रोटोकॉल (एचटीटीपी या XMPP) या Admin SDK का इस्तेमाल करना होगा.