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
पद्धति को ओवरराइड करके,
आपको मिलने वाले रेवेन्यू के हिसाब से कार्रवाई की जा सकती है
रिमोट मैसेज
ऑब्जेक्ट और संदेश डेटा पाएं:
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 सूचना वाले मैसेज इस डिवाइस पर भेजता है सिस्टम ट्रे. जब उपयोगकर्ता सूचना पर टैप करता है, तो उसके हिसाब से ऐप्लिकेशन लॉन्चर खुलता है डिफ़ॉल्ट.
इसमें ऐसे मैसेज शामिल हैं जिनमें सूचना और डेटा, दोनों शामिल होते हैं पेलोड (और सूचना कंसोल से भेजे गए सभी मैसेज) को ऐक्सेस करने के लिए किया जा सकता है. इन मामलों में, सूचना डिवाइस के सिस्टम ट्रे और डेटा पेलोड को इंटेंट के अतिरिक्त में डिलीवर किया जाता है आपके लॉन्चर की गतिविधि की समीक्षा की जा सकती है.
अपने ऐप्लिकेशन पर मैसेज डिलीवरी की अहम जानकारी के लिए, इसे देखें 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
को भी डायरेक्ट बूट करना होगा पता है (डायरेक्ट बूट मोड में क्रेडेंशियल से सुरक्षित किए गए स्टोरेज का ऐक्सेस नहीं है).
डिवाइस को डायरेक्ट बूट मोड में मैसेज भेजने के बारे में दिशा-निर्देश पाने के लिए, यहां देखें डायरेक्ट बूट की सुविधा वाले मैसेज भेजें.