Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

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

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

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

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

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

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

ओवरराइड 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.
}

कोटलिन + केटीएक्स

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()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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