Firebase is back at Google I/O on May 10! Register now

Android ऐप में संदेश प्राप्त करें

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

फायरबेस सूचनाएं प्राप्त करने वाले ऐप की अग्रभूमि/पृष्ठभूमि स्थिति के आधार पर अलग-अलग व्यवहार करती हैं। यदि आप अग्रभूमि वाले ऐप्स को अधिसूचना संदेश या डेटा संदेश प्राप्त करना चाहते हैं, तो आपको onMessageReceived कॉलबैक को संभालने के लिए कोड लिखना होगा। अधिसूचना और डेटा संदेशों के बीच अंतर की व्याख्या के लिए, संदेश प्रकार देखें।

संदेशों को संभालना

संदेश प्राप्त करने के लिए, ऐसी सेवा का उपयोग करें जो FirebaseMessagingService का विस्तार करती है। आपकी सेवा को onMessageReceived और onDeletedMessages कॉलबैक को ओवरराइड करना चाहिए। इसे प्राप्ति के 20 सेकंड के भीतर किसी भी संदेश को हैंडल करना चाहिए (एंड्रॉइड मार्शमैलो पर 10 सेकंड)। onMessageReceived कॉल करने से पहले हुए ओएस विलंब के आधार पर समय विंडो कम हो सकती है। उस समय के बाद, Android O की पृष्ठभूमि निष्पादन सीमा जैसे विभिन्न OS व्यवहार आपके काम को पूरा करने की आपकी क्षमता में हस्तक्षेप कर सकते हैं। अधिक जानकारी के लिए संदेश प्राथमिकता पर हमारा अवलोकन देखें।

निम्न अपवादों के साथ, अधिकांश संदेश प्रकारों के लिए 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 के लिए कस्टम डिफ़ॉल्ट रंग का उपयोग करता है

  • नोटिफिकेशन कंपोजर से भेजे गए सभी नोटिफिकेशन संदेश।
  • कोई सूचना संदेश जो अधिसूचना पेलोड में स्पष्ट रूप से रंग सेट नहीं करता है।

यदि कोई कस्टम डिफ़ॉल्ट आइकन सेट नहीं किया गया है और अधिसूचना पेलोड में कोई आइकन सेट नहीं किया गया है, तो एंड्रॉइड एप्लिकेशन आइकन को सफेद रंग में प्रदर्शित करता है।

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}")

        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.
    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() पर कॉलबैक मिल सकता है। अगर आपने पिछले 4 हफ़्तों में उस डिवाइस पर ऐप को संदेश नहीं भेजा है, तो FCM onDeletedMessages() को कॉल नहीं करेगा।

एक पृष्ठभूमि वाले ऐप में सूचना संदेशों को संभालें

जब आपका ऐप पृष्ठभूमि में होता है, तो Android अधिसूचना संदेशों को सिस्टम ट्रे में निर्देशित करता है। अधिसूचना पर एक उपयोगकर्ता टैप डिफ़ॉल्ट रूप से ऐप लॉन्चर खोलता है।

इसमें वे संदेश शामिल हैं जिनमें सूचना और डेटा पेलोड (और सूचना कंसोल से भेजे गए सभी संदेश) दोनों शामिल हैं। इन मामलों में, सूचना डिवाइस के सिस्टम ट्रे में डिलीवर की जाती है, और डेटा पेलोड आपके लॉन्चर गतिविधि के इरादे के अतिरिक्त में डिलीवर किया जाता है।

अपने ऐप पर संदेश वितरण की जानकारी के लिए, FCM रिपोर्टिंग डैशबोर्ड देखें, जो Android ऐप्स के लिए "इंप्रेशन" (उपयोगकर्ताओं द्वारा देखी गई सूचनाएं) के डेटा के साथ-साथ Apple और Android उपकरणों पर भेजे गए और खोले गए संदेशों की संख्या को रिकॉर्ड करता है।

पृष्ठभूमि प्रतिबंधित ऐप्स (एंड्रॉइड पी या नया)

FCM उन ऐप्स को संदेश डिलीवर नहीं कर सकता है जिन्हें उपयोगकर्ता द्वारा पृष्ठभूमि प्रतिबंध में डाल दिया गया था (जैसे: सेटिंग -> ऐप्स और अधिसूचना -> [ऐपनाम] -> बैटरी)। एक बार आपके ऐप को पृष्ठभूमि प्रतिबंध से हटा दिए जाने के बाद, ऐप में नए संदेश पहले की तरह डिलीवर हो जाएंगे। खोए हुए संदेशों और अन्य पृष्ठभूमि प्रतिबंध प्रभावों को रोकने के लिए, सुनिश्चित करें कि Android Vitas प्रयास द्वारा सूचीबद्ध खराब व्यवहारों से बचना है। इन व्यवहारों के कारण Android डिवाइस उपयोगकर्ता को यह अनुशंसा कर सकता है कि आपका ऐप पृष्ठभूमि प्रतिबंधित हो। isBackgroundRestricted() का उपयोग करके आपका ऐप यह जांच सकता है कि यह पृष्ठभूमि प्रतिबंधित है या नहीं।

डायरेक्ट बूट मोड में FCM संदेश प्राप्त करें

ऐसे डेवलपर जो डिवाइस के अनलॉक होने से पहले ही ऐप्स को FCM संदेश भेजना चाहते हैं, डिवाइस के सीधे बूट मोड में होने पर Android ऐप को संदेश प्राप्त करने के लिए सक्षम कर सकते हैं। उदाहरण के लिए, हो सकता है कि आप चाहें कि आपके ऐप के उपयोगकर्ता लॉक डिवाइस पर भी अलार्म नोटिफिकेशन प्राप्त करें।

इस उपयोग के मामले का निर्माण करते समय, प्रत्यक्ष बूट मोड के लिए सामान्य सर्वोत्तम अभ्यासों और प्रतिबंधों का पालन करें। प्रत्यक्ष बूट-सक्षम संदेशों की दृश्यता पर विचार करना विशेष रूप से महत्वपूर्ण है; डिवाइस तक पहुंच रखने वाला कोई भी उपयोगकर्ता इन संदेशों को उपयोगकर्ता क्रेडेंशियल दर्ज किए बिना देख सकता है।

आवश्यक शर्तें

  • डिवाइस को सीधे बूट मोड के लिए सेट अप किया जाना चाहिए।
  • डिवाइस में Google Play सेवाओं का नवीनतम संस्करण स्थापित होना चाहिए (19.0.54 या बाद का)।
  • FCM संदेश प्राप्त करने के लिए ऐप को FCM SDK ( com.google.firebase:firebase-messaging ) का उपयोग करना चाहिए।

अपने ऐप में डायरेक्ट बूट मोड मैसेज हैंडलिंग को सक्षम करें

  1. ऐप-लेवल ग्रैडल फ़ाइल में, FCM डायरेक्ट बूट सपोर्ट लाइब्रेरी पर निर्भरता जोड़ें:

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. ऐप मेनिफ़ेस्ट में 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 सीधे बूट अवेयर होने की भी आवश्यकता होगी (डायरेक्ट बूट मोड में क्रेडेंशियल प्रोटेक्टेड स्टोरेज तक पहुंच नहीं)।

प्रत्यक्ष बूट मोड में उपकरणों को संदेश भेजने पर मार्गदर्शन के लिए, सीधे बूट-सक्षम संदेश भेजें देखें।