Firebase की सूचनाएं, ऐक्सेस करने वाले ऐप्लिकेशन के फ़ोरग्राउंड/बैकग्राउंड की स्थिति के आधार पर
अलग-अलग तरीके से काम करती हैं. अगर आपको फ़ोरग्राउंड वाले ऐप्लिकेशन को सूचना वाले मैसेज या डेटा मैसेज
पाने की सुविधा चाहिए, तो आपको onMessageReceived
कॉलबैक को मैनेज करने के लिए कोड लिखना होगा.
सूचना और डेटा मैसेज के बीच का अंतर जानने के लिए,
मैसेज के टाइप देखें.
मैसेज मैनेज करना
मैसेज पाने के लिए,
FirebaseMessagingService
तक इस्तेमाल करने वाली सेवा का इस्तेमाल करें.
आपकी सेवा, onMessageReceived
और onDeletedMessages
कॉलबैक को बदल देगी.
किसी मैसेज को हैंडल करने में 20 सेकंड से कम समय लग सकता है. यह इस बात पर निर्भर करता है कि onMessageReceived
को कॉल करने में कितनी देरी हुई है. इनमें ओएस की देरी, ऐप्लिकेशन के शुरू होने में लगने वाला समय, दूसरी कार्रवाइयों की वजह से मुख्य थ्रेड का ब्लॉक होना या onMessageReceived
पर किए गए पिछले कॉल की वजह से ज़्यादा समय लग सकता है. इसके बाद, ओएस से जुड़ी अलग-अलग तरह की गतिविधियां, जैसे कि Android की
प्रोसेस
किलिंग या Android O की
बैकग्राउंड में एक्ज़ीक्यूशन करने की सीमाएं हो सकती हैं. इस वजह से हो सकता है कि आप अपना काम पूरा न कर पाएं.
onMessageReceived
का इस्तेमाल ज़्यादातर मैसेज टाइप के लिए किया जाता है. हालांकि, इनमें ये अपवाद शामिल हैं:
-
ऐप्लिकेशन के बैकग्राउंड में चलने पर, मिलने वाले सूचना मैसेज. ऐसे में, डिवाइस की सिस्टम ट्रे पर सूचना भेजी जाती है. जब उपयोगकर्ता किसी सूचना पर टैप करता है, तो डिफ़ॉल्ट रूप से ऐप्लिकेशन लॉन्चर खुल जाता है.
-
बैकग्राउंड में मिलने वाले सूचना और डेटा पेलोड, दोनों वाले मैसेज. इस स्थिति में, सूचना को डिवाइस की सिस्टम ट्रे में डिलीवर किया जाता है. साथ ही, डेटा पेलोड, आपके लॉन्चर की गतिविधि के इंटेंट के अतिरिक्त हिस्से में डिलीवर किया जाता है.
संक्षेप में:
ऐप्लिकेशन की स्थिति | सूचना | डेटा | दोनों |
---|---|---|---|
फ़ोरग्राउंड | onMessageReceived |
onMessageReceived |
onMessageReceived |
बैकग्राउंड | सिस्टम ट्रे | onMessageReceived |
सूचना: सिस्टम ट्रे डेटा: इंटेंट की दूसरी चीज़ों में. |
ऐप्लिकेशन मेनिफ़ेस्ट में बदलाव करें
FirebaseMessagingService
का इस्तेमाल करने के लिए, आपको अपने ऐप्लिकेशन मेनिफ़ेस्ट में यह जानकारी
जोड़नी होगी:
<service android:name=".java.MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
साथ ही, आपको सूचनाएं दिखाने के तरीके को पसंद के मुताबिक बनाने के लिए, डिफ़ॉल्ट वैल्यू सेट करने का सुझाव दिया जाता है. आपके पास एक कस्टम डिफ़ॉल्ट आइकॉन और पसंद के मुताबिक डिफ़ॉल्ट रंग तय करने का विकल्प है. ये रंग तब लागू होते हैं, जब सूचना पेलोड में इनसे मिलती-जुलती वैल्यू सेट न हों.
कस्टम डिफ़ॉल्ट आइकॉन और पसंद के मुताबिक रंग सेट करने के लिए, इन लाइनों को
application
टैग में जोड़ें:
<!-- 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, इसके लिए कस्टम डिफ़ॉल्ट आइकॉन दिखाता है
- सूचनाओं लिखने वाले व्यक्ति से मिले सूचनाओं वाले सभी मैसेज.
- सूचना पेलोड में आइकॉन को साफ़ तौर पर सेट न करने वाला कोई भी सूचना मैसेज.
Android इसके लिए कस्टम डिफ़ॉल्ट रंग का इस्तेमाल करता है
- सूचनाओं लिखने वाले व्यक्ति से मिले सूचनाओं वाले सभी मैसेज.
- ऐसा कोई भी सूचना मैसेज जिसमें सूचना पेलोड में रंग को साफ़ तौर पर सेट न किया गया हो.
अगर कोई कस्टम डिफ़ॉल्ट आइकॉन सेट नहीं है और सूचना पेलोड में कोई आइकॉन सेट नहीं है, तो Android, रेंडर किए गए ऐप्लिकेशन आइकॉन को सफ़ेद रंग में दिखाता है.
onMessageReceived
को बदलें
FirebaseMessagingService.onMessageReceived
तरीके को बदलकर,
उस remoteMessage ऑब्जेक्ट के हिसाब से कार्रवाइयां की जा सकती हैं और मैसेज का डेटा पाया जा सकता है:
Kotlin+KTX
override fun onMessageReceived(remoteMessage: RemoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: ${remoteMessage.from}") // Check if message contains a data payload. if (remoteMessage.data.isNotEmpty()) { Log.d(TAG, "Message data payload: ${remoteMessage.data}") // Check if data needs to be processed by long running job if (needsToBeScheduled()) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob() } else { // Handle message within 10 seconds handleNow() } } // Check if message contains a notification payload. remoteMessage.notification?.let { Log.d(TAG, "Message Notification Body: ${it.body}") } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
Java
@Override public void onMessageReceived(RemoteMessage remoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob(); } else { // Handle message within 10 seconds handleNow(); } } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
onDeletedMessages
को बदलें
कुछ मामलों में, हो सकता है कि FCM मैसेज डिलीवर न कर पाए. ऐसा तब होता है, जब कनेक्ट होते समय किसी डिवाइस पर आपका ऐप्लिकेशन बहुत ज़्यादा मैसेज (>100) हो या कोई डिवाइस एक महीने से ज़्यादा समय से FCM से कनेक्ट नहीं हुआ हो. इन मामलों में,
आपको FirebaseMessagingService.onDeletedMessages()
पर कॉलबैक मिल सकता है.
जब ऐप्लिकेशन इंस्टेंस को यह कॉलबैक मिलता है,
तो इसे आपके ऐप्लिकेशन सर्वर के साथ पूरी तरह से सिंक करना चाहिए. अगर आपने पिछले चार हफ़्तों में उस डिवाइस पर ऐप्लिकेशन को मैसेज नहीं भेजा है, तो FCM onDeletedMessages()
को कॉल नहीं करेगा.
बैकग्राउंड में चलने वाले ऐप्लिकेशन में सूचना वाले मैसेज मैनेज करना
जब आपका ऐप्लिकेशन बैकग्राउंड में होता है, तब Android, सूचना वाले मैसेज को सिस्टम ट्रे पर भेजता है. उपयोगकर्ता द्वारा सूचना पर टैप करने से डिफ़ॉल्ट रूप से ऐप्लिकेशन लॉन्चर खुल जाता है.
इसमें ऐसे मैसेज शामिल हैं जिनमें सूचना और डेटा पेलोड, दोनों शामिल होते हैं. साथ ही, इसमें Notifications कंसोल से भेजे गए सभी मैसेज भी शामिल होते हैं. इन मामलों में, सूचना को डिवाइस की सिस्टम ट्रे में भेजा जाता है. साथ ही, डेटा पेलोड को लॉन्चर की गतिविधि के इंटेंट के अतिरिक्त हिस्से में डिलीवर किया जाता है.
अपने ऐप्लिकेशन पर मैसेज डिलीवरी के बारे में अहम जानकारी के लिए, FCM रिपोर्टिंग डैशबोर्ड देखें. यह Apple और Android डिवाइस पर भेजे गए और खोले गए मैसेज की संख्या रिकॉर्ड करता है. साथ ही, इसमें Android ऐप्लिकेशन के "इंप्रेशन" (उपयोगकर्ताओं को दिखने वाली सूचनाएं) का डेटा भी रिकॉर्ड होता है.
डायरेक्ट बूट मोड में FCM मैसेज पाएं
जो डेवलपर डिवाइस के अनलॉक होने से पहले ही ऐप्लिकेशन पर FCM मैसेज भेजना चाहते हैं वे डिवाइस के डायरेक्ट बूट मोड में होने पर भी Android ऐप्लिकेशन को मैसेज पाने की सुविधा चालू कर सकते हैं. उदाहरण के लिए, हो सकता है कि आप चाहें कि आपके ऐप्लिकेशन के उपयोगकर्ताओं को लॉक किए हुए डिवाइस पर भी अलार्म की सूचनाएं मिलें.
इस्तेमाल का यह उदाहरण बनाते समय, डायरेक्ट बूट मोड के लिए सबसे सही तरीके और पाबंदियां देखें. डायरेक्ट बूट की सुविधा वाले मैसेज की मौजूदगी पर ध्यान देना खास तौर पर ज़रूरी होता है. डिवाइस का ऐक्सेस रखने वाला कोई भी उपयोगकर्ता, उपयोगकर्ता के क्रेडेंशियल डाले बिना इन मैसेज को देख सकता है.
ज़रूरी शर्तें
- डिवाइस को डायरेक्ट बूट मोड के लिए सेट अप किया जाना ज़रूरी है.
- डिवाइस में Google Play services का नया वर्शन इंस्टॉल होना चाहिए (19.0.54 या उसके बाद का वर्शन).
- FCM मैसेज पाने के लिए, ऐप्लिकेशन को FCM SDK (
com.google.firebase:firebase-messaging
) का इस्तेमाल करना होगा.
अपने ऐप्लिकेशन में डायरेक्ट बूट मोड मैसेज मैनेज करना चालू करें
ऐप्लिकेशन-लेवल की Gradle फ़ाइल में, FCM डायरेक्ट बूट सहायता लाइब्रेरी पर निर्भरता जोड़ें:
implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
ऐप्लिकेशन मेनिफ़ेस्ट में
android:directBootAware="true"
एट्रिब्यूट जोड़कर, ऐप्लिकेशन केFirebaseMessagingService
डायरेक्ट बूट की जानकारी बनाएं:<service android:name=".java.MyFirebaseMessagingService" android:exported="false" android:directBootAware="true"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
यह पक्का करना ज़रूरी है कि यह FirebaseMessagingService
, डायरेक्ट बूट मोड में चल सकता है. इन ज़रूरी शर्तों को देखें:
- डायरेक्ट बूट मोड में चलते समय, सेवा को क्रेडेंशियल से सुरक्षित किए गए स्टोरेज को ऐक्सेस नहीं करना चाहिए.
- सेवा को
Activities
,BroadcastReceivers
या अन्यServices
जैसे कॉम्पोनेंट का इस्तेमाल करने की कोशिश नहीं करनी चाहिए, जिन्हें डायरेक्ट बूट मोड में इस्तेमाल करते समय डायरेक्ट बूट अवेयर के तौर पर मार्क नहीं किया गया है. - इस सेवा में, क्रेडेंशियल से सुरक्षित स्टोरेज को ऐक्सेस करने की अनुमति नहीं है. साथ ही, डायरेक्ट बूट मोड में चलने के दौरान नॉन-directBootAware कॉम्पोनेंट को कॉल भी नहीं करना चाहिए. इसका मतलब है कि ऐप्लिकेशन में जिन लाइब्रेरी का इस्तेमाल सेवा से कॉल किया जाता है उन्हें या तो डायरेक्ट बूट की जानकारी होनी चाहिए या ऐप्लिकेशन को यह देखना होगा कि वह डायरेक्ट बूट मोड में चल रहा है या नहीं और उन्हें उस मोड में कॉल नहीं करना होगा. उदाहरण के लिए, Firebase SDK टूल, डायरेक्ट बूट के साथ काम करते हैं (इन्हें डायरेक्ट बूट मोड में क्रैश किए बिना ऐप्लिकेशन में शामिल किया जा सकता है), लेकिन कई Firebase एपीआई, डायरेक्ट बूट मोड में कॉल किए जाने की सुविधा नहीं देते.
- अगर ऐप्लिकेशन में पसंद के मुताबिक बनाए गए
Application
का इस्तेमाल किया जा रहा है, तोApplication
को डायरेक्ट बूट मोड की जानकारी होनी चाहिए (डायरेक्ट बूट मोड में क्रेडेंशियल की मदद से सुरक्षित स्टोरेज का ऐक्सेस नहीं होना चाहिए).
डिवाइसों को डायरेक्ट बूट मोड में मैसेज भेजने के बारे में जानकारी पाने के लिए, डायरेक्ट बूट की सुविधा वाले मैसेज भेजना देखें.