Google 致力于为黑人社区推动种族平等。查看具体举措
इस पेज का अनुवाद Cloud Translation API से किया गया है.
Switch to English

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

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

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

संदेश प्राप्त करने के लिए, ऐसी सेवा का उपयोग करें जो FirebaseMessagingService विस्तार करती है। आपकी सेवा को onMessageReceived और onDeletedMessages कॉलबैक को ओवरराइड करना चाहिए। यह रसीद के 20 सेकंड के भीतर किसी भी संदेश को संभालना चाहिए (एंड्रॉइड मार्शमैलो पर 10 सेकंड)। onMessageReceived को कॉल करने से पहले 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 ऑब्जेक्ट के आधार पर कार्य कर सकते हैं और संदेश डेटा प्राप्त कर सकते हैं:

जावा

@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.
}

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.
}

onDeletedMessages ओवरराइड करें

कुछ स्थितियों में, FCM एक संदेश नहीं दे सकता है। यह तब होता है जब आपके ऐप के लिए किसी विशेष डिवाइस पर बहुत सारे संदेश (> 100) लंबित होते हैं, जिस समय यह डिवाइस कनेक्ट होता है या एक से अधिक महीने में FCM से कनेक्ट नहीं होता है। इन मामलों में, आपको FirebaseMessagingService.onDeletedMessages() कॉलबैक प्राप्त हो सकता है जब एप्लिकेशन इंस्टेंस को यह कॉलबैक प्राप्त होता है, तो उसे अपने ऐप सर्वर के साथ पूर्ण सिंक करना चाहिए। यदि आपने पिछले 4 सप्ताह के भीतर उस डिवाइस पर एप्लिकेशन को कोई संदेश नहीं भेजा है, तो FCM onDeletedMessages() कॉल नहीं करेगा।

बैकग्राउंड ऐप में नोटिफिकेशन संदेशों को हैंडल करें

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

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

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

पृष्ठभूमि प्रतिबंधित ऐप्स (Android P या नया)

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

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

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

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

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

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

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

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

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. ऐप के FirebaseMessagingService डायरेक्ट बूट को android:directBootAware="true" को जोड़कर जागरूक करें android:directBootAware="true" ऐप मैनिफ़ेस्ट में android:directBootAware="true" विशेषता:

    <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 भी प्रत्यक्ष बूट बारे में पता (प्रत्यक्ष बूट मोड में क्रेडेंशियल संरक्षित संग्रहण पर पहुँच नहीं) होने की आवश्यकता होगी।

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