इस गाइड में, मोबाइल और वेब क्लाइंट ऐप्लिकेशन में Firebase Cloud Messaging सेट अप करने का तरीका बताया गया है, ताकि आपको भरोसेमंद तरीके से मैसेज मिल सकें.
मैसेज पाने के लिए, FirebaseMessagingService
की सुविधा देने वाली किसी सेवा का इस्तेमाल किया जा सकता है.
आपकी सेवा को onMessageReceived
और onDeletedMessages
कॉलबैक को ओवरराइड करना चाहिए. पूरे उदाहरण के लिए, Firebase Cloud Messaging का क्विकस्टार्ट सैंपल देखें.
onMessageReceived
की सुविधा, ज़्यादातर तरह के मैसेज के लिए उपलब्ध है. हालांकि, यहां दिए गए मैसेज के लिए यह सुविधा उपलब्ध नहीं है:
ऐप्लिकेशन के बैकग्राउंड में होने पर डिलीवर किए गए सूचना वाले मैसेज. इस मामले में, सूचना डिवाइस की सिस्टम ट्रे में भेजी जाती है. जब कोई उपयोगकर्ता किसी सूचना पर टैप करता है, तो ऐप्लिकेशन लॉन्चर डिफ़ॉल्ट रूप से खुलता है.
सूचना और डेटा पेलोड, दोनों वाले मैसेज को बैकग्राउंड में मिलने पर. इस मामले में, सूचना को डिवाइस की सिस्टम ट्रे में डिलीवर किया जाता है. साथ ही, डेटा पेलोड को आपके लॉन्चर ऐक्टिविटी के इंटेंट के एक्स्ट्रा में डिलीवर किया जाता है.
सारांश में:
ऐप्लिकेशन का स्टेटस | सूचना | डेटा | दोनों |
---|---|---|---|
फ़ोरग्राउंड | onMessageReceived |
onMessageReceived |
onMessageReceived |
बैकग्राउंड | सिस्टम ट्रे | onMessageReceived |
सूचना: सिस्टम ट्रे डेटा: इंटेंट के अतिरिक्त डेटा में. |
मैसेज टाइप के बारे में ज़्यादा जानने के लिए, सूचनाएं और डेटा मैसेज लेख पढ़ें.
onMessageReceived
कॉलबैक को कम समय में पूरा करना होता है. इस विंडो की अवधि कई फ़ैक्टर पर निर्भर करती है. जैसे, ओएस में देरी, ऐप्लिकेशन शुरू होने में लगने वाला समय, मुख्य थ्रेड का अन्य कार्रवाइयों से ब्लॉक होना या पिछले onMessageReceived
कॉल में ज़्यादा समय लगना.
इसलिए, आपको onMessageReceived
में लंबे समय तक चलने वाले टास्क (जैसे, सूचना में दिखाने के लिए सर्वर से इमेज फ़ेच करना) से बचना चाहिए. इसके बजाय, WorkManager
का इस्तेमाल करके कोई टास्क शेड्यूल करें, ताकि उन टास्क को मैनेज किया जा सके जिन्हें पूरा होने में कुछ सेकंड से ज़्यादा समय लग सकता है. मैसेज की प्राथमिकता और इससे प्रोसेसिंग पर पड़ने वाले असर के बारे में ज़्यादा जानने के लिए, ज़्यादा और सामान्य प्राथमिकता वाले मैसेज की प्रोसेसिंग लेख पढ़ें.
ऐप्लिकेशन मेनिफ़ेस्ट में बदलाव करना
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, ऐप्लिकेशन आइकॉन को सफ़ेद रंग में रेंडर करके दिखाता है.
onMessageReceived
को ओवरराइड करना
FirebaseMessagingService.onMessageReceived
तरीके को बदलकर, आपको मिले RemoteMessage ऑब्जेक्ट के आधार पर कार्रवाइयां की जा सकती हैं. साथ ही, मैसेज का डेटा भी पाया जा सकता है:
Kotlin
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 console से भेजे गए सभी मैसेज भी शामिल होते हैं. इन मामलों में, सूचना डिवाइस की सिस्टम ट्रे में भेजी जाती है. साथ ही, डेटा पेलोड को आपके लॉन्चर ऐक्टिविटी के इंटेंट के एक्स्ट्रा में भेजा जाता है.
आपके ऐप्लिकेशन पर मैसेज डिलीवर होने के बारे में ज़्यादा जानने के लिए,
FCM रिपोर्टिंग डैशबोर्ड देखें. यह डैशबोर्ड, Apple और Android डिवाइसों पर भेजे गए और खोले गए मैसेज की संख्या रिकॉर्ड करता है. साथ ही, Android ऐप्लिकेशन के लिए "इंप्रेशन" (उपयोगकर्ताओं को दिखने वाली सूचनाएं) का डेटा भी रिकॉर्ड करता है.