फ़ायरबेस सूचनाएं प्राप्त करने वाले ऐप की अग्रभूमि/पृष्ठभूमि स्थिति के आधार पर अलग-अलग व्यवहार करती हैं। यदि आप चाहते हैं कि अग्रभूमि वाले ऐप्स अधिसूचना संदेश या डेटा संदेश प्राप्त करें, तो आपको onMessageReceived
कॉलबैक को संभालने के लिए कोड लिखना होगा। अधिसूचना और डेटा संदेशों के बीच अंतर की व्याख्या के लिए, संदेश प्रकार देखें।
संदेशों को संभालना
संदेश प्राप्त करने के लिए, ऐसी सेवा का उपयोग करें जो FirebaseMessagingService
का विस्तार करती हो। आपकी सेवा को onMessageReceived
और onDeletedMessages
कॉलबैक को ओवरराइड करना चाहिए।
किसी संदेश को संभालने के लिए समय विंडो 20 सेकंड से कम हो सकती है, जो onMessageReceived
पर कॉल करने से पहले हुई देरी पर निर्भर करती है, जिसमें OS देरी, ऐप स्टार्टअप समय, अन्य ऑपरेशनों द्वारा मुख्य थ्रेड को ब्लॉक किया जाना, या पिछले onMessageReceived
कॉल में बहुत अधिक समय लगना शामिल है। उस समय के बाद, विभिन्न OS व्यवहार जैसे 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" />
एंड्रॉइड के लिए कस्टम डिफ़ॉल्ट आइकन प्रदर्शित करता है
- अधिसूचना कंपोजर से भेजे गए सभी अधिसूचना संदेश।
- कोई भी अधिसूचना संदेश जो अधिसूचना पेलोड में स्पष्ट रूप से आइकन सेट नहीं करता है।
एंड्रॉइड के लिए कस्टम डिफ़ॉल्ट रंग का उपयोग करता है
- अधिसूचना कंपोजर से भेजे गए सभी अधिसूचना संदेश।
- कोई भी अधिसूचना संदेश जो अधिसूचना पेलोड में स्पष्ट रूप से रंग सेट नहीं करता है।
यदि कोई कस्टम डिफ़ॉल्ट आइकन सेट नहीं है और अधिसूचना पेलोड में कोई आइकन सेट नहीं है, तो एंड्रॉइड एप्लिकेशन आइकन को सफेद रंग में प्रदर्शित करता है।
onMessageReceived
ओवरराइड करें
FirebaseMessagingService.onMessageReceived
विधि को ओवरराइड करके, आप प्राप्त रिमोटमैसेज ऑब्जेक्ट के आधार पर क्रियाएं कर सकते हैं और संदेश डेटा प्राप्त कर सकते हैं:
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
ओवरराइड करें
कुछ स्थितियों में, एफसीएम संदेश नहीं दे सकता है। ऐसा तब होता है जब किसी विशेष डिवाइस पर कनेक्ट होने के समय आपके ऐप के लिए बहुत अधिक संदेश (>100) लंबित होते हैं या यदि डिवाइस एक महीने से अधिक समय से एफसीएम से कनेक्ट नहीं हुआ है। इन मामलों में, आपको FirebaseMessagingService.onDeletedMessages()
पर कॉलबैक प्राप्त हो सकता है। जब ऐप इंस्टेंस को यह कॉलबैक प्राप्त होता है, तो इसे आपके ऐप सर्वर के साथ पूर्ण सिंक करना चाहिए। यदि आपने पिछले 4 सप्ताह के भीतर उस डिवाइस पर ऐप पर कोई संदेश नहीं भेजा है, तो FCM onDeletedMessages()
कॉल नहीं करेगा।पृष्ठभूमि वाले ऐप में अधिसूचना संदेशों को संभालें
जब आपका ऐप बैकग्राउंड में होता है, तो एंड्रॉइड नोटिफिकेशन संदेशों को सिस्टम ट्रे पर निर्देशित करता है। उपयोगकर्ता द्वारा अधिसूचना पर टैप करने से ऐप लॉन्चर डिफ़ॉल्ट रूप से खुल जाता है।
इसमें वे संदेश शामिल हैं जिनमें अधिसूचना और डेटा पेलोड (और अधिसूचना कंसोल से भेजे गए सभी संदेश) दोनों शामिल हैं। इन मामलों में, अधिसूचना डिवाइस के सिस्टम ट्रे में वितरित की जाती है, और डेटा पेलोड आपके लॉन्चर गतिविधि के इरादे के अतिरिक्त में वितरित किया जाता है।
अपने ऐप पर संदेश वितरण की जानकारी के लिए, एफसीएम रिपोर्टिंग डैशबोर्ड देखें, जो ऐप्पल और एंड्रॉइड डिवाइस पर भेजे गए और खोले गए संदेशों की संख्या को रिकॉर्ड करता है, साथ ही एंड्रॉइड ऐप के लिए "इंप्रेशन" (उपयोगकर्ताओं द्वारा देखी गई सूचनाएं) के डेटा को भी रिकॉर्ड करता है।
सीधे बूट मोड में FCM संदेश प्राप्त करें
जो डेवलपर्स डिवाइस अनलॉक होने से पहले ही ऐप्स को FCM संदेश भेजना चाहते हैं, वे डिवाइस के सीधे बूट मोड में होने पर एंड्रॉइड ऐप को संदेश प्राप्त करने में सक्षम कर सकते हैं। उदाहरण के लिए, हो सकता है कि आप चाहते हों कि आपके ऐप के उपयोगकर्ताओं को लॉक डिवाइस पर भी अलार्म सूचनाएं प्राप्त हों।
इस उपयोग के मामले का निर्माण करते समय, प्रत्यक्ष बूट मोड के लिए सामान्य सर्वोत्तम प्रथाओं और प्रतिबंधों का पालन करें। प्रत्यक्ष बूट-सक्षम संदेशों की दृश्यता पर विचार करना विशेष रूप से महत्वपूर्ण है; डिवाइस तक पहुंच रखने वाला कोई भी उपयोगकर्ता उपयोगकर्ता क्रेडेंशियल दर्ज किए बिना इन संदेशों को देख सकता है।
आवश्यक शर्तें
- डिवाइस को डायरेक्ट बूट मोड के लिए सेट किया जाना चाहिए।
- डिवाइस में Google Play सेवाओं का नवीनतम संस्करण स्थापित होना चाहिए (19.0.54 या बाद का)।
- FCM संदेश प्राप्त करने के लिए ऐप को FCM SDK (
com.google.firebase:firebase-messaging
) का उपयोग करना चाहिए।
अपने ऐप में डायरेक्ट बूट मोड संदेश प्रबंधन सक्षम करें
ऐप-स्तरीय ग्रैडल फ़ाइल में, 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
जैसे घटकों का उपयोग करने का प्रयास नहीं करना चाहिए जिन्हें डायरेक्ट बूट मोड में चलते समय डायरेक्ट बूट अवेयर के रूप में चिह्नित नहीं किया गया है। - सेवा द्वारा उपयोग की जाने वाली किसी भी लाइब्रेरी को सीधे बूट मोड में चलने के दौरान क्रेडेंशियल संरक्षित स्टोरेज तक नहीं पहुंचना चाहिए और न ही गैर-डायरेक्टबूटअवेयर घटकों को कॉल करना चाहिए। इसका मतलब यह है कि ऐप जिन लाइब्रेरी का उपयोग करता है, जिन्हें सेवा से कॉल किया जाता है, उन्हें या तो सीधे बूट के बारे में जागरूक होने की आवश्यकता होगी, या ऐप को यह जांचने की आवश्यकता होगी कि क्या यह डायरेक्ट बूट मोड में चल रहा है और उन्हें उस मोड में कॉल नहीं करना होगा। उदाहरण के लिए, फायरबेस एसडीके डायरेक्ट बूट के साथ काम करते हैं (उन्हें डायरेक्ट बूट मोड में क्रैश किए बिना किसी ऐप में शामिल किया जा सकता है), लेकिन कई फायरबेस एपीआई डायरेक्ट बूट मोड में कॉल किए जाने का समर्थन नहीं करते हैं।
- यदि ऐप एक कस्टम
Application
उपयोग कर रहा है, तोApplication
डायरेक्ट बूट अवेयर होने की भी आवश्यकता होगी (डायरेक्ट बूट मोड में क्रेडेंशियल संरक्षित स्टोरेज तक पहुंच नहीं)।
डायरेक्ट बूट मोड में डिवाइसों पर संदेश भेजने पर मार्गदर्शन के लिए, सीधे बूट-सक्षम संदेश भेजें देखें।