android - Firebase onMessageReceived को तब नहीं बुलाया जाता जब ऐप बैकग्राउंड में हो




push-notification firebase-cloud-messaging (3)

मैं अपने Android ऐप में हमारी मैसेजिंग सेवा के लिए Firebase का उपयोग कर रहा हूं। मैंने Firebase पर काफी शोध किया है और मुझे समझ में आया है कि क्या ऐप अगर अग्रभूमि में चल रहा है या अब onMessageReceived पद्धति में प्राप्त डेटा के प्रकार को बदल देगा ।

जो मैं पूरा करने की कोशिश कर रहा हूं, वह है रिमॉटेमेज़ेज से आने वाले डेटा को पार्स करना और कस्टम टैग के आधार पर इसके साथ कुछ अलग करना। IE, यदि डेटा मैप में "My_Custom_Tag" नामक फ़ील्ड शामिल है, तो मैं मानक फायरबेस संदेश को पूरी तरह से ओवरराइड करना चाहता हूं जो पॉप अप करता है और एक कस्टम लिखता है।

समस्या यह है, जब ऐप बैकग्राउंड में चल रहा होता है, तो मैं जिस भी कोड को ऑनमैसेज में डालता हूं, वह कभी ट्रिगर नहीं होता है। यह तभी ठीक काम करता है जब ऐप अग्रभूमि में चल रहा हो, लेकिन ऐप पृष्ठभूमि में होने पर कुछ भी पता नहीं करेगा / प्राप्त नहीं करेगा।

नीचे कुछ नमूना कोड दिया गया है:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);

    Map<String, String> aMap = remoteMessage.getData();
    //Custom object here for easier parsing
    PushNotificationsPojo pojo = this.convertResponseToPojo(aMap);

    if(pojo == null){
        passToFirebase(remoteMessage);
        return;
    }

    if(pojo.getData().getCustomTag().equals(PushNotificationsPojo.ID_TAG_CHAT_MESSAGE)) {
        createCustomNotification1(pojo);

    } else if (pojo.getData().getCustomTag().equals(PushNotificationsPojo.ID_TAG_SOME_OTHER_MESSAGE)){
        createCustomNotification2(pojo);

    } else if (pojo.getData().getCustomTag().equals(PushNotificationsPojo.ID_TAG_STUFF_AND_WHATNOT)) {
        createCustomNotification3(pojo);

    } else {
        passToFirebase(remoteMessage);
    }
}

मेरा प्रश्न है, मैं MyFirebaseMessagingService के संपादन के बारे में कैसे जाऊँ ताकि मैं आने वाले डेटा की जाँच कर सकूँ, टैग जानकारी निर्धारित कर सकूँ, या तो इसे फायरबेस पर पास करने का निर्णय ले सकूँ, ताकि यह मानक हैंडलिंग का उपयोग कर सके या इसे फायरबेस में न लिख सके और अपना लिख ​​सके जब मेरा ऐप बैकग्राउंड में चल रहा हो, तब सभी कस्टम डिस्प्ले नोटिफिकेशन?

सबको शुक्रीया!

पुनश्च, किसी भी मौका Firebase- कालकोठरी-मास्टर फ्रैंक वैन Puffelen एक विचार है?


OnMessageReceived पद्धति में डेटा पेलोड वितरित करने के लिए अपने FCM संदेशों से सूचना पेलोड को हटा दें।

this और this ध्यान से पढ़ें।

जब आपका ऐप बैकग्राउंड में होता है, तो डेटा पेलोड को ऑनमैसेजेज किए गए तरीके से डिलीवर किया जाता है, अगर कोई नोटिफिकेशन पेलोड न हो । ( शब्दों को अंकित करें )

यदि मामले में दोनों पेलोड मौजूद हैं तो सिस्टम स्वचालित रूप से नोटिफिकेशन पार्ट (सिस्टम ट्रे) को संभालता है और लॉन्चर एक्टिविटी (नोटिफिकेशन पर यूजर टैप के बाद) के एक्स्ट्रास में आपके ऐप को डेटा पेलोड मिलता है।

एंड्रॉइड और आईओएस दोनों प्लेटफार्मों को सफलतापूर्वक सेवा देने में सक्षम होने के लिए, आपको क्लाइंट के ओएस के अनुसार अलग-अलग एफसीएम संदेश भेजने पड़ सकते हैं।


इस post , Koot उत्तर आपके समाधान हो सकता है। उन्होंने कहा "मुझे भी यही समस्या थी। 'सूचना' के बजाय 'डेटा संदेश' का उपयोग करना अधिक आसान है। डेटा संदेश हमेशा कक्षा को लोड करता है।

मेरी सलाह के अनुसार उसका समाधान है

{
  "condition": "'reader' in topics",

  "data": {
    "title":"Please Check",
    "message": "This is a Firebase Cloud Messaging Topic Message 5!"
   }
}

बहुत यकीन है, आप पहले से ही Android में व्यवहार को जानते हैं कि notification और data पेलोड दोनों का उपयोग करते समय, एंड्रॉइड सिस्टम पकड़ता है कि notification में क्या है और टैप किए जाने पर data पेलोड इरादे में शामिल है।

AFAIK, यह एकमात्र तरीका है जो इसे जाता है (जैसा कि @ArthurThompson द्वारा here उल्लेख किया गया here ) और यदि आप वास्तव में यह सुनिश्चित करना चाहते हैं कि onMessageReceived() हमेशा कहा जाता है, तो आपको केवल पेलोड का उपयोग data (जैसा कि @DiegoGiorgini द्वारा here उल्लेख किया गया here ) हालाँकि, मैंने चारों ओर देखा है, शायद कोई दूसरा रास्ता है।

मैंने इसे स्वयं आज़माया नहीं है, लेकिन क्या आपने यह जांचने पर विचार किया है कि स्टेटस बार में कौन सी सूचनाएं हैं , तो यदि आपकी अधिसूचना मौजूद है ( पूरी तरह से सुनिश्चित नहीं है कि क्या आप वास्तव में पहचान सकते हैं कि कौन सा आपके ऐप के लिए एक अधिसूचना है ), लेकिन तरीकों को कॉल करें आप आमतौर पर onMessageReceived() अंदर कॉल करते हैं।

एक दृष्टिकोण जो आप भी कर सकते हैं, यह पता लगाने के लिए कि यदि डिवाइस (ओं) को आप संदेश भेज रहे हैं, तो आप ऐप सर्वर में एक एंड्रॉइड डिवाइस है, तो केवल एक data पेलोड भेजें।





firebase-cloud-messaging