Android ऐप्लिकेशन में मैसेज पाना

Firebase की सूचनाएं फ़ोरग्राउंड/बैकग्राउंड के हिसाब से अलग-अलग तरह से काम करती हैं पाने वाले ऐप्लिकेशन की स्थिति. अगर आपको फ़ोरग्राउंड में चलने वाले ऐप्लिकेशन का ऐक्सेस चाहिए या डेटा संदेश, तो उन्हें हैंडल करने के लिए आपको कोड लिखना होगा onMessageReceived कॉलबैक. सूचना और डेटा मैसेज के बीच के अंतर के बारे में जानने के लिए, मैसेज के टाइप लेख पढ़ें.

मैसेज मैनेज करना

मैसेज पाने के लिए, ऐसी सेवा का इस्तेमाल करें जो FirebaseMessagingService की सुविधा देती हो. आपकी सेवा, onMessageReceived और onDeletedMessages कॉलबैक को बदल देनी चाहिए.

किसी मैसेज को हैंडल करने के लिए, 20 सेकंड से कम समय भी लग सकता है. यह समय, onMessageReceived को कॉल करने में हुई देरी पर निर्भर करता है. इसमें ओएस में हुई देरी, ऐप्लिकेशन के स्टार्टअप में लगने वाला समय, मुख्य थ्रेड को दूसरे ऑपरेशन से ब्लॉक किया जाना या पिछले onMessageReceived कॉल में ज़्यादा समय लगना शामिल है. इसके बाद, ओएस के अलग-अलग व्यवहार, जैसे कि Android की प्रोसेस को बंद करना या Android O की बैकग्राउंड में प्रोसेस चलाने की सीमाएं, आपके काम को पूरा करने में रुकावट डाल सकती हैं.

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

  • सूचनाएं कंपोज़र से भेजे गए सभी सूचना मैसेज.
  • सूचना वाला कोई भी मैसेज, जिसमें सूचना के पेलोड में रंग साफ़ तौर पर सेट न किया गया हो.

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

onMessageReceived बदलें

FirebaseMessagingService.onMessageReceived पद्धति को ओवरराइड करके, आपको दिए गए डेटा के हिसाब से कार्रवाई की जा सकती है रिमोट मैसेज ऑब्जेक्ट और संदेश डेटा पाएं:

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

        // 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 सूचनाओं को सिस्टम ट्रे में भेजता है. उपयोगकर्ता के नोटिफ़िकेशन पर टैप करने पर, डिफ़ॉल्ट रूप से ऐप्लिकेशन लॉन्चर खुलता है.

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

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

डायरेक्ट बूट मोड में FCM मैसेज पाएं

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

इस उदाहरण को बनाते समय, डायरेक्ट बूट मोड के लिए सबसे सही तरीके और पाबंदियों को ध्यान में रखें. डिवाइस को सीधे चालू करने की सुविधा वाले मैसेज की प्रॉपर्टी को ध्यान में रखना ज़रूरी है. डिवाइस का ऐक्सेस रखने वाला कोई भी व्यक्ति, उपयोगकर्ता के क्रेडेंशियल डाले बिना ये मैसेज देख सकता है.

ज़रूरी शर्तें

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

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

  1. ऐप्लिकेशन-लेवल की Gradle फ़ाइल में, 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 जिन्हें डायरेक्ट बूट मोड में चलते समय, डायरेक्ट बूट अवेयर के तौर पर मार्क नहीं किया गया हो.
  • सेवा के लिए इस्तेमाल की जाने वाली सभी लाइब्रेरी को क्रेडेंशियल से सुरक्षित स्टोरेज को ऐक्सेस नहीं करना चाहिए. साथ ही, डायरेक्ट बूट मोड में चलने के दौरान, नॉन-डायरेक्टबूटअवेयर कॉम्पोनेंट को कॉल नहीं करना चाहिए. इसका मतलब है कि ऐप्लिकेशन में इस्तेमाल की जाने वाली ऐसी सभी लाइब्रेरी जिन्हें सेवा से कॉल किया जाता है उन्हें डायरेक्ट बूट के बारे में पता होना चाहिए. इसके अलावा, ऐप्लिकेशन को यह भी देखना होगा कि वह डायरेक्ट बूट मोड में चल रहा है या नहीं. अगर वह डायरेक्ट बूट मोड में नहीं चल रहा है, तो उसे लाइब्रेरी को उस मोड में कॉल नहीं करना चाहिए. उदाहरण के लिए, Firebase SDK टूल, डायरेक्ट बूट के साथ काम करते हैं (उन्हें बिना डायरेक्ट बूट मोड में क्रैश हो जाता है), लेकिन कई Firebase एपीआई, डायरेक्ट बूट मोड में कॉल करने की सुविधा का इस्तेमाल नहीं करते बूट मोड.
  • अगर ऐप्लिकेशन किसी कस्टम Application का इस्तेमाल कर रहा है, तो Application को डायरेक्ट बूट के बारे में भी पता होना चाहिए. डायरेक्ट बूट मोड में, क्रेडेंशियल से सुरक्षित स्टोरेज का ऐक्सेस नहीं होता.

डिवाइस को डायरेक्ट बूट मोड में मैसेज भेजने के बारे में दिशा-निर्देश पाने के लिए, यहां देखें डायरेक्ट बूट की सुविधा वाले मैसेज भेजें.