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

प्लैटफ़ॉर्म चुनें: iOS+ Android Web Flutter Unity C++


मैसेज पाने के लिए, ऐसी सेवा का इस्तेमाल किया जा सकता है जो FirebaseMessagingService की सुविधा देती हो. आपकी सेवा को onMessageReceived और onDeletedMessages कॉलबैक को बदलना चाहिए. पूरे उदाहरण के लिए, Firebase Cloud Messaging का क्विकस्टार्ट सैंपल देखें.

onMessageReceived की सुविधा, ज़्यादातर तरह के मैसेज के लिए उपलब्ध है. हालांकि, यहां दिए गए मैसेज के लिए यह सुविधा उपलब्ध नहीं है:

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

  • बैकग्राउंड में सूचना और डेटा पेलोड, दोनों वाले मैसेज मिलने पर. इस मामले में, सूचना को डिवाइस की सिस्टम ट्रे में भेजा जाता है. साथ ही, डेटा पेलोड को आपके लॉन्चर ऐक्टिविटी के इंटेंट के एक्स्ट्रा में भेजा जाता है.

सारांश में:

ऐप्लिकेशन की स्थिति सूचना डेटा दोनों
फ़ोरग्राउंड onMessageReceived onMessageReceived onMessageReceived
बैकग्राउंड सिस्टम ट्रे onMessageReceived सूचना: सिस्टम ट्रे डेटा: इंटेंट के अतिरिक्त डेटा में.

मैसेज टाइप के बारे में ज़्यादा जानने के लिए, सूचनाएं और डेटा मैसेज लेख पढ़ें.

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

इसलिए, आपको onMessageReceived में लंबे समय तक चलने वाले टास्क (जैसे, सूचना में दिखाने के लिए सर्वर से इमेज फ़ेच करना) नहीं करने चाहिए. इसके बजाय, WorkManager का इस्तेमाल करके कोई टास्क शेड्यूल करें, ताकि उन टास्क को हैंडल किया जा सके जिन्हें पूरा होने में कुछ सेकंड से ज़्यादा समय लग सकता है. मैसेज की प्राथमिकता और इससे प्रोसेस करने पर पड़ने वाले असर के बारे में ज़्यादा जानने के लिए, ज़्यादा और सामान्य प्राथमिकता वाले मैसेज को प्रोसेस करना लेख पढ़ें.

ऐप्लिकेशन मेनिफ़ेस्ट में बदलाव करना

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, इनके लिए कस्टम डिफ़ॉल्ट आइकॉन दिखाता है और उनका इस्तेमाल करता है

  • Firebase कंसोल में सूचनाएं कंपोज़ करने की सुविधा से भेजे गए सभी सूचना वाले मैसेज.

  • ऐसा सूचना मैसेज जिसमें सूचना पेलोड में आइकॉन को साफ़ तौर पर सेट नहीं किया गया है.

अगर कस्टम डिफ़ॉल्ट आइकॉन सेट नहीं किया गया है और सूचना के पेलोड में आइकॉन सेट नहीं किया गया है, तो 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.
}

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

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

बैकग्राउंड में चल रहे ऐप्लिकेशन में सूचना वाले मैसेज मैनेज करना

जब आपका ऐप्लिकेशन बैकग्राउंड में होता है, तब Android सूचना वाले मैसेज को सिस्टम ट्रे में भेजता है. सूचना पर टैप करने से, ऐप्लिकेशन लॉन्चर डिफ़ॉल्ट रूप से खुल जाता है.

इसमें ऐसे मैसेज शामिल हैं जिनमें सूचना और डेटा पेलोड, दोनों शामिल होते हैं. साथ ही, इसमें Firebase कंसोल में सूचनाएं कंपोज़ करने वाले टूल से भेजे गए सभी मैसेज भी शामिल होते हैं. इन मामलों में, सूचना डिवाइस की सिस्टम ट्रे में भेजी जाती है. साथ ही, डेटा पेलोड को आपके लॉन्चर ऐक्टिविटी के इंटेंट के एक्स्ट्रा में भेजा जाता है.

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