इस गाइड में, मोबाइल और वेब क्लाइंट ऐप्लिकेशन में Firebase Cloud Messaging सेट अप करने का तरीका बताया गया है, ताकि आपको भरोसेमंद तरीके से मैसेज मिल सकें.
मैसेज पाने के लिए, ऐसी सेवा का इस्तेमाल करें जो FirebaseMessagingService
की सुविधा देती हो.
आपकी सेवा को onMessageReceived
और onDeletedMessages
कॉलबैक को ओवरराइड करना चाहिए.
onMessageReceived
की सुविधा, ज़्यादातर तरह के मैसेज के लिए उपलब्ध है. हालांकि, यहां दिए गए मैसेज के लिए यह सुविधा उपलब्ध नहीं है:
ऐप्लिकेशन के बैकग्राउंड में होने पर डिलीवर किए गए सूचना वाले मैसेज. इस मामले में, सूचना डिवाइस की सिस्टम ट्रे में भेजी जाती है. जब कोई उपयोगकर्ता किसी सूचना पर टैप करता है, तो ऐप्लिकेशन लॉन्चर डिफ़ॉल्ट रूप से खुलता है.
सूचना और डेटा पेलोड, दोनों वाले मैसेज को बैकग्राउंड में मिलने पर. इस मामले में, सूचना को डिवाइस की सिस्टम ट्रे में डिलीवर किया जाता है. साथ ही, डेटा पेलोड को आपके लॉन्चर ऐक्टिविटी के इंटेंट के एक्स्ट्रा में डिलीवर किया जाता है.
सारांश में:
ऐप्लिकेशन का स्टेटस | सूचना | डेटा | दोनों |
---|---|---|---|
फ़ोरग्राउंड | onMessageReceived |
onMessageReceived |
onMessageReceived |
बैकग्राउंड | सिस्टम ट्रे | onMessageReceived |
सूचना: सिस्टम ट्रे डेटा: इंटेंट के अतिरिक्त डेटा में. |
मैसेज टाइप के बारे में ज़्यादा जानने के लिए, सूचनाएं और डेटा मैसेज लेख पढ़ें.
onMessageReceived
कॉलबैक को टाइमआउट दिए जाते हैं. इनकी मदद से, सूचना पोस्ट की जा सकती है. हालांकि, टाइमर को इस तरह से डिज़ाइन नहीं किया गया है कि ऐप्लिकेशन को नेटवर्क ऐक्सेस करने या अन्य काम करने की अनुमति मिले. इसलिए, अगर आपका ऐप्लिकेशन कोई ज़्यादा जटिल काम करता है, तो आपको यह पक्का करने के लिए ज़्यादा काम करना होगा कि ऐप्लिकेशन अपना काम पूरा कर सके.
अगर आपको लगता है कि आपके ऐप्लिकेशन को किसी मैसेज को प्रोसेस करने में 10 सेकंड लग सकते हैं, तो आपको WorkManager जॉब शेड्यूल करनी चाहिए या नीचे दिए गए WakeLock के दिशा-निर्देशों का पालन करना चाहिए. कुछ मामलों में, मैसेज को हैंडल करने के लिए मिलने वाला समय 10 सेकंड से कम हो सकता है. ऐसा 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, ऐप्लिकेशन के आइकॉन को सफ़ेद रंग में रेंडर करके दिखाता है.
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. }
FCM मैसेज मैनेज करते समय, डिवाइस को चालू रखना
अगर आपके ऐप्लिकेशन को FCM मैसेज प्रोसेस करते समय डिवाइस को चालू रखना है, तो उसे इस दौरान WakeLock को होल्ड करना होगा. इसके अलावा, उसे WorkManager जॉब बनाना होगा. WakeLocks, प्रोसेसिंग से जुड़ी उन छोटी गतिविधियों के लिए बेहतर तरीके से काम करते हैं जिनमें onMessageReceived
डिफ़ॉल्ट टाइमआउट से ज़्यादा समय लग सकता है. ज़्यादा समय तक चलने वाले वर्कफ़्लो के लिए, WorkManager जॉब का इस्तेमाल करना WakeLock के मुकाबले ज़्यादा सही होता है. जैसे, अपने सर्वर को एक से ज़्यादा सीरियल आरपीसी भेजना. इस सेक्शन में, हम WakeLocks का इस्तेमाल करने के तरीके पर फ़ोकस करते हैं. WakeLock, ऐप्लिकेशन के चलने के दौरान डिवाइस को स्लीप मोड में जाने से रोकता है. इससे बैटरी का इस्तेमाल बढ़ सकता है. इसलिए, WakeLock का इस्तेमाल सिर्फ़ उन मामलों में किया जाना चाहिए जहां मैसेज हैंडल करते समय, आपके ऐप्लिकेशन को रोका नहीं जाना चाहिए. जैसे:
- उपयोगकर्ता को ऐसी सूचनाएं भेजी जाती हैं जो समय के हिसाब से ज़रूरी होती हैं.
- डिवाइस से बाहर किसी ऐसी चीज़ के साथ इंटरैक्शन हो रहा हो जिसमें रुकावट नहीं आनी चाहिए. जैसे, नेटवर्क ट्रांसफ़र या किसी दूसरे डिवाइस (जैसे, पेयर की गई घड़ी) के साथ कम्यूनिकेशन.
सबसे पहले, आपको यह पक्का करना होगा कि आपका ऐप्लिकेशन, WakeLock की अनुमति का अनुरोध करता हो. FCM SDK में यह अनुमति डिफ़ॉल्ट रूप से शामिल होती है. इसलिए, आम तौर पर कुछ भी जोड़ने की ज़रूरत नहीं होती.
<uses-permission android:name="android.permission.WAKE_LOCK" />
इसके बाद, आपके ऐप्लिकेशन को FirebaseMessagingService.onMessageReceived()
कॉलबैक की शुरुआत में WakeLock हासिल करना होगा और कॉलबैक के आखिर में इसे रिलीज़ करना होगा.
ऐप्लिकेशन का कस्टम FirebaseMessagingService
:
@Override
public void onMessageReceived(final RemoteMessage message) {
// If this is a message that is time sensitive or shouldn't be interrupted
WakeLock wakeLock = getSystemService(PowerManager.class).newWakeLock(PARTIAL_WAKE_LOCK, "myApp:messageReceived");
try {
wakeLock.acquire(TIMEOUT_MS);
// handle message
...
finally {
wakeLock.release();
}
}
onDeletedMessages
को ओवरराइड करना
कुछ मामलों में, FCM मैसेज नहीं भेज सकता. ऐसा तब होता है, जब किसी डिवाइस पर आपके ऐप्लिकेशन के लिए 100 से ज़्यादा मैसेज पेंडिंग हों. ऐसा तब भी हो सकता है, जब डिवाइस एक महीने से ज़्यादा समय से FCM से कनेक्ट न हुआ हो. ऐसे मामलों में, आपको FirebaseMessagingService.onDeletedMessages()
पर कॉल बैक मिल सकता है. जब ऐप्लिकेशन इंस्टेंस को यह कॉलबैक मिलता है, तो उसे आपके ऐप्लिकेशन सर्वर के साथ पूरी तरह सिंक करना चाहिए. अगर आपने पिछले चार हफ़्तों में उस डिवाइस पर मौजूद ऐप्लिकेशन को कोई मैसेज नहीं भेजा है, तो FCM, onDeletedMessages()
को कॉल नहीं करेगा.
बैकग्राउंड में चल रहे ऐप्लिकेशन में सूचना वाले मैसेज मैनेज करना
जब आपका ऐप्लिकेशन बैकग्राउंड में होता है, तब Android सूचना वाले मैसेज को सिस्टम ट्रे में भेजता है. कोई उपयोगकर्ता जब सूचना पर टैप करता है, तो ऐप्लिकेशन लॉन्चर डिफ़ॉल्ट रूप से खुल जाता है.
इसमें ऐसे मैसेज शामिल हैं जिनमें सूचना और डेटा पेलोड, दोनों शामिल होते हैं. साथ ही, इसमें Notifications console से भेजे गए सभी मैसेज भी शामिल होते हैं. इन मामलों में, सूचना डिवाइस की सिस्टम ट्रे में भेजी जाती है. साथ ही, डेटा पेलोड को आपके लॉन्चर ऐक्टिविटी के इंटेंट के एक्स्ट्रा में भेजा जाता है.
आपके ऐप्लिकेशन पर मैसेज डिलीवर होने की जानकारी पाने के लिए,
FCM रिपोर्टिंग डैशबोर्ड देखें. यह डैशबोर्ड, Apple और Android डिवाइसों पर भेजे गए और खोले गए मैसेज की संख्या रिकॉर्ड करता है. साथ ही, Android ऐप्लिकेशन के लिए "इंप्रेशन" (उपयोगकर्ताओं को दिखने वाली सूचनाएं) का डेटा भी रिकॉर्ड करता है.