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




firebase-cloud-messaging (18)

1. ऐसा क्यों हो रहा है?

FCM (फायरबेस क्लाउड मेसेजिंग) में दो प्रकार के संदेश हैं:

  1. संदेश प्रदर्शित करें : ये संदेश onMessageReceived() कॉलबैक को ट्रिगर करते हैं जब आपका ऐप अग्रभूमि में होता है
  2. डेटा संदेश : आपके संदेश अग्रभूमि या पृष्ठभूमि में या मारे जाने पर भी onMessageReceived() संदेश onMessageReceived() कॉलबैक ट्रिगर करते हैं

फायरबेस टीम ने आपके उपकरणों पर data-messages भेजने के लिए अभी तक यूआई विकसित नहीं किया है।

2. कैसे?

इसे प्राप्त करने के लिए, आपको निम्नलिखित URL पर एक POST अनुरोध करना होगा:

POST https://fcm.googleapis.com/fcm/send

हेडर

  • कुंजी: Content-Type , मूल्य: application/json
  • कुंजी: Authorization , मूल्य: key=<your-server-key>

विषयों का उपयोग करने वाला शरीर

{
    "to": "/topics/my_topic",
    "data": {
        "my_custom_key": "my_custom_value",
        "my_custom_key2": true
     }
}

या यदि आप इसे विशिष्ट उपकरणों पर भेजना चाहते हैं

{
    "data": {
        "my_custom_key": "my_custom_value",
        "my_custom_key2": true
     },
    "registration_ids": ["{device-token}","{device2-token}","{device3-token}"]
}


नोट: सुनिश्चित करें कि आप JSON कुंजी notification नहीं जोड़ रहे हैं
नोट: अपना सर्वर कुंजी प्राप्त करने के लिए, आप इसे फायरबेस कंसोल में पा सकते हैं: Your project -> settings -> Project settings -> Cloud messaging -> Server Key

3. पुश नोटिफिकेशन मैसेज को कैसे हैंडल करें?

यह है कि आप प्राप्त संदेश को कैसे संभालते हैं:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();
     String myCustomKey = data.get("my_custom_key");

     // Manage data
}

यहाँ मेरी अभिव्यक्ति है

    <service android:name=".fcm.PshycoFirebaseMessagingServices">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

    <service android:name=".fcm.PshycoFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

जब ऐप बैकग्राउंड में होता है और नोटिफिकेशन आता है तो डिफॉल्ट नोटिफिकेशन आ जाता है और मेरा कोड onMessageReceived रन नहीं होता है।

यहाँ मेरा onMessageReceived कोड है। अगर मेरा ऐप बैकग्राउंड में चल रहा है, तो बैकग्राउंड में ऐप नहीं होने पर यह इनवाइट करता है। जब ऐप बैकग्राउंड में भी हो तो इस कोड को कैसे चलाएं?

// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // If the application is in the foreground handle both data and notification messages here.
    // 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.
    data = remoteMessage.getData();
    String title = remoteMessage.getNotification().getTitle();
    String message = remoteMessage.getNotification().getBody();
    String imageUrl = (String) data.get("image");
    String action = (String) data.get("action");
    Log.i(TAG, "onMessageReceived: title : "+title);
    Log.i(TAG, "onMessageReceived: message : "+message);
    Log.i(TAG, "onMessageReceived: imageUrl : "+imageUrl);
    Log.i(TAG, "onMessageReceived: action : "+action);

    if (imageUrl == null) {
        sendNotification(title,message,action);
    } else {
        new BigPictureNotification(this,title,message,imageUrl,action);
    }
}
// [END receive_message]

2017 अद्यतन उत्तर

इस बारे में docs से स्पष्ट जवाब है:


आप onMessageReceived (RemoteMessage RemoteMessage) को पृष्ठभूमि में काम करना चाहते हैं, केवल डेटा भाग सूचना भेजें:

 "data": {
"message": "2",
"title": "1",
"pushType" : "banner",
"bannerLink": "http://www.google.com",
"image" : "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"}

"अन्यता": "सत्य", "टू": "डिवाइस आईडी या डिवाइस टोकन"

इसके द्वारा onMessageRecivied कॉल बैकग्राउंड और फोरग्राउंड है जिसे आपके लॉन्चर एक्टिविटी पर नोटिफिकेशन ट्रे का उपयोग करके नोटिफिकेशन को संभालने की कोई आवश्यकता नहीं है। इसका उपयोग करने में डेटा पेलोड संभालें:

        Bundle extras = intent.getExtras();
        String bannerLink = extras.getString("bannerLink");
        ...
        String channelId = extras.getString("channelId");

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

POST: https://fcm.googleapis.com/v1/projects/YOUR_FIREBASEDB_ID/messages:send

और onMessageReceived में डेटा को पकड़ा

Key: Content-Type, Value: application/json

उपरोक्त उत्तरों के अलावा, यदि आप FCM कंसोल का उपयोग करके पुश नोटिफिकेशन का परीक्षण कर रहे हैं, तो पुश नोटिफिकेशन बंडल में 'डेटा' कुंजी और ऑब्जेक्ट नहीं जोड़ा जाता है। इसलिए जब ऐप बैकग्राउंड या मारी जाएगी तो आपको विस्तृत पुश नोटिफिकेशन नहीं मिलेगा।

इस स्थिति में आपको ऐप बैकग्राउंड परिदृश्य का परीक्षण करने के लिए अपने बैक एंड एडमिन कंसोल का विकल्प चुनना होगा।

यहां, आपने अपने पुश बंडल में 'डेटा' कुंजी जोड़ी होगी। इसलिए, अपेक्षित के रूप में विस्तृत धक्का दिखाया जाएगा। आशा है कि यह कुछ मदद करता है।


जून 2018 उत्तर -

आपको यह सुनिश्चित करना होगा कि संदेश में कहीं भी "सूचना" कीवर्ड नहीं है। केवल "डेटा" शामिल करें, और एप्लिकेशन ऑनमैसेजेज में संदेश को संभालने में सक्षम होगा, भले ही पृष्ठभूमि में या मार दिया गया हो।

क्लाउड फ़ंक्शंस का उपयोग करना:

"data":    "image": "",    "message": "Firebase Push Message Using API", 

फिर अपने onMessageReceived () में, अपनी कक्षा में com.google.firebase.messaging.FirebaseMessagingService का विस्तार करते हुए:

  public void onMessageReceived(RemoteMessage remoteMessage)
    if (remoteMessage.getData().size() > 0) 
    Log.d(TAG, "Message data payload: " + remoteMessage.getData());      

मैंने एक ही समस्या का अनुभव किया है और फायरबेस लाइब्रेरी को फिर से शुरू किया है और जब एप्लिकेशन बैकग्राउंड में होता है तो नोटिफिकेशन भेजने से रोकता है

* पुस्तकालय https://github.com/erdalceylan/com-google-firebase-messaging

 dependencies {
        compile 'com.google.firebase:firebase-core:11.2.0'
        compile 'com.github.erdalceylan:com-google-firebase-messaging:v1-11.2.0'
    }

*

@WorkerThread
public void onMessageReceived(RemoteMessage var1) {
  //your app is in background or foreground all time calling
}

आशा मदद करती है। सौभाग्य


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

बाकी ग्राहक टूल लिंक: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo

इस url का उपयोग करें: - https://fcm.googleapis.com/fcm/send सामग्री-प्रकार: एप्लिकेशन / json प्राधिकरण: कुंजी = आपका सर्वर कुंजी या स्वतः-कुंजी कुंजी (रेफरी नीचे देखें)

var PROJECT_ID = 'YOUR_PROJECT_ID';
var HOST = 'fcm.googleapis.com';
var PATH = '/v1/projects/' + PROJECT_ID + '/messages:send';
var MESSAGING_SCOPE = 'https://www.googleapis.com/auth/firebase.messaging';
var SCOPES = [MESSAGING_SCOPE];

  router.get('/', function(req, res, next) {
      res.render('index', { title: 'Express' });
      getAccessToken().then(function(accessToken) {
        console.log("TOKEN: "+accessToken)
      })

    });

function getAccessToken() {
return new Promise(function(resolve, reject) {
    var key = require('./YOUR_DOWNLOADED_JSON_FILE.json');
    var jwtClient = new google.auth.JWT(
        key.client_email,
        null,
        key.private_key,
        SCOPES,
        null
    );
    jwtClient.authorize(function(err, tokens) {
        if (err) {
            reject(err);
            return;
        }
        resolve(tokens.access_token);
    });
});
}

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

और आपको एपीआई का उपयोग करके भेजे गए अपने पोस्ट अनुरोध के "टू" अनुभाग में रिसीवर के टोकन को डालना होगा।


इस तरह सरल सारांश

  • अगर आपका ऐप चल रहा है;

    onMessageReceived()

ट्रिगर है।

  • अगर आपका ऐप नहीं चल रहा है (स्वाइप करके मारा गया);

    onMessageReceived()

ट्रिगर नहीं किया जाता है और direclty द्वारा वितरित किया जाता है। यदि आपके पास कोई विशेष कुंजी-मूल्य जोड़ी है। वे onMessageReceived () काम नहीं कर रहे हैं।

मैं इस तरह से मिला;

अपनी लॉन्चर गतिविधि में, यह तर्क रखें,

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState, R.layout.activity_splash);

    if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("PACKAGE_NAME")) {

        // do what you want

        // and this for killing app if we dont want to start
        android.os.Process.killProcess(android.os.Process.myPid());

    } else {

        //continue to app
    }
}

इस में अगर ब्लॉक, फायरबस यूआई के अनुसार अपनी कुंजी खोजें।

इस उदाहरण में मेरी कुंजी और मूल्य ऊपर की तरह; (भाषा के लिए खेद =)

जब मेरा कोड काम करता है, तो मुझे "com.rda.note" मिलता है।

android.os.Process.killProcess(android.os.Process.myPid());

कोड की इस पंक्ति के साथ, मैंने अपना एप्लिकेशन बंद कर दिया और Google Play Market को खोल दिया

खुश कोडिंग =)


चूंकि display-messages जो फायरबेस अधिसूचना यूआई से भेजे जाते हैं, केवल तभी काम करते हैं जब आपका ऐप अग्रभूमि में हो। data-messages , https://fcm.googleapis.com/fcm/send को POST कॉल करने की आवश्यकता है

कदम

  1. उन्नत रेस्ट क्लाइंट Google क्रोम एक्सटेंशन इंस्टॉल करें

  2. निम्नलिखित शीर्ष लेख जोड़ें

    कुंजी : सामग्री-प्रकार, मूल्य : आवेदन / json

    कुंजी : प्राधिकरण, मूल्य : कुंजी = "आपका सर्वर कुंजी"

  3. शरीर को जोड़ो

    • यदि विषयों का उपयोग कर रहा है:

      {
          "to" : "/topics/topic_name",
          "data": {
          "key1" : "value1",
          "key2" : "value2",
          }
      }
    • यदि पंजीकरण आईडी का उपयोग कर रहे हैं:

      {
          "registration_ids" : "[{"id"},{id1}]",
          "data": {
          "key1" : "value1",
          "key2" : "value2",
           }
      }

बस!। अब हमेशा की तरह onMessageReceived callback को onMessageReceived

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();
     String value1 = data.get("key1");
     String value2 = data.get("key2");
}

निम्नलिखित मामलों में अपने onMessageReceived () को कॉल करने के लिए फायरबेस लाइब्रेरी बनाएं

  1. अग्रभूमि में ऐप
  2. पृष्ठभूमि में अनुप्रयोग
  3. ऐप को मार दिया गया है

आपको अपने अनुरोध को JSON की 'नोटिफिकेशन' को Firebase API में नहीं डालना चाहिए, बल्कि 'डेटा' का उपयोग करना चाहिए, नीचे देखें।

जब आपका ऐप बैकग्राउंड में है या मारा गया है, तो निम्न संदेश आपके onMessageReceived () को कॉल नहीं करेगा और आप उसकी सूचना को अनुकूलित नहीं कर सकते।

{
   "to": "/topics/journal",
   "notification": {
   "title" : "title",
   "text": "data!",
   "icon": "ic_notification"
    }
}

लेकिन इसके बजाय यह काम करेगा

{
  "to": "/topics/dev_journal",
   "data": {
       "text":"text",
       "title":"",
       "line1":"Journal",
       "line2":"刊物"
   }
} 

मूल रूप से, संदेश आपके डेटा ऑब्जेक्ट के साथ मैप के रूप में तर्क RemoteMessage में भेजा जाता है, फिर आप नोटिफिकेशन को प्रबंधित कर सकते हैं।

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();

     //you can get your text message here.
     String text= data.get("text");


     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
        // optional, this is to make beautiful icon
             .setLargeIcon(BitmapFactory.decodeResource(
                                    getResources(), R.mipmap.ic_launcher))  
        .setSmallIcon(smallIcon)  //mandatory
      .......
    /*You can read more on notification here:
    https://developer.android.com/training/notify-user/build-notification.html
    https://www.youtube.com/watch?v=-iog_fmm6mE
    */
}

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

इन चरणों का पालन करें और जब आपका ऐप बैकग्राउंड में होगा तब आप अपने नोटिफिकेशन को प्रोसेस कर पाएंगे।

1. इस तरह एक इरादे-फिल्टर जोड़ें:

<activity android:name=".MainActivity">
      <intent-filter>
           <action android:name=".MainActivity" />
           <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
</activity>

एक गतिविधि जिसे आप सूचना डेटा को संसाधित करना चाहते हैं।

  1. अगले प्रारूप के साथ सूचनाएं भेजें:

    { 
     "notification" : {
            "click_action" : ".MainActivity", 
            "body" : "new Symulti update !", 
            "title" : "new Symulti update !", 
            "icon" : "ic_notif_symulti" }, 
     "data": { ... },
     "to" : "c9Vaa3ReGdk:APA91bH-AuXgg3lDN2WMcBrNhJZoFtYF9" }

यहां कुंजी जोड़ दी गई है

"click_action" : ".MainActivity"

जहाँ .MainActivity आप चरण 1 में जोड़े गए आशय-फ़िल्टर के साथ गतिविधि है।

  1. ".MainActivity" के नोटिफिकेशन में नोटिफिकेशन से "डेटा" जानकारी प्राप्त करें:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //get notification data info
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
           //bundle must contain all info sent in "data" field of the notification
        }
    }

और आपको बस इतना करना चाहिए। मुझे आशा है कि यह किसी की मदद करता है :)


यहां फायरबेस संदेश के बारे में अधिक स्पष्ट अवधारणाएं हैं। मुझे यह उनकी सपोर्ट टीम से मिला।

फायरबेस के तीन संदेश प्रकार हैं :

अधिसूचना संदेश : अधिसूचना संदेश पृष्ठभूमि या अग्रभूमि पर काम करता है। जब ऐप बैकग्राउंड में होता है, तो नोटिफिकेशन मैसेज सिस्टम ट्रे में डिलीवर हो जाते हैं। यदि एप्लिकेशन अग्रभूमि में है, तो संदेश onMessageReceived() या didReceiveRemoteNotification कॉलबैक द्वारा नियंत्रित किए onMessageReceived() । ये अनिवार्य रूप से प्रदर्शन संदेश के रूप में संदर्भित होते हैं।

डेटा संदेश : एंड्रॉइड प्लेटफॉर्म पर, डेटा संदेश पृष्ठभूमि और अग्रभूमि पर काम कर सकता है। डेटा संदेश onMessageReceived () द्वारा नियंत्रित किया जाएगा। यहां एक प्लेटफ़ॉर्म विशिष्ट नोट होगा: एंड्रॉइड पर, डेटा पेलोड को आपकी गतिविधि लॉन्च करने के लिए उपयोग किए जाने वाले इरादे में पुनर्प्राप्त किया जा सकता है। विस्तृत करने के लिए, यदि आपके पास "click_action":"launch_Activity_1" , तो आप केवल getIntent() से getIntent() माध्यम से इस आशय को पुनः प्राप्त कर सकते हैं।

अधिसूचना और डेटा पेलोड दोनों के साथ संदेश : जब पृष्ठभूमि में, एप्लिकेशन अधिसूचना ट्रे में सूचना पेलोड प्राप्त करते हैं, और उपयोगकर्ता द्वारा अधिसूचना पर टैप करने पर केवल डेटा पेलोड को संभालते हैं। अग्रभूमि में होने पर, आपके एप्लिकेशन को उपलब्ध दोनों पेलोड के साथ एक संदेश ऑब्जेक्ट प्राप्त होता है। दूसरे, click_action पैरामीटर अक्सर सूचना पेलोड में उपयोग किया जाता है और डेटा पेलोड में नहीं। यदि डेटा पेलोड के अंदर उपयोग किया जाता है, तो इस पैरामीटर को कस्टम की-वैल्यू पेयर के रूप में माना जाएगा और इसलिए आपको इसके लिए कस्टम लॉजिक को लागू करने की आवश्यकता होगी।

इसके अलावा, मैं आपको डेटा बंडल निकालने के लिए onMessageReceived विधि (डेटा संदेश देखें) का उपयोग करने की सलाह देता हूं। आपके तर्क से, मैंने बंडल ऑब्जेक्ट की जाँच की और अपेक्षित डेटा सामग्री नहीं पाई। यहां एक ऐसे ही मामले का संदर्भ दिया गया है जो अधिक स्पष्टता प्रदान कर सकता है।

अधिक जानकारी के लिए मेरे इस धागे पर जाएँ


संदेश को पृष्ठभूमि में कैप्चर करने के लिए आपको एक BroadcastReceiver का उपयोग करना होगा

import android.content.Context
import android.content.Intent
import android.util.Log
import androidx.legacy.content.WakefulBroadcastReceiver
import com.google.firebase.messaging.RemoteMessage

class FirebaseBroadcastReceiver : WakefulBroadcastReceiver() {

    val TAG: String = FirebaseBroadcastReceiver::class.java.simpleName

    override fun onReceive(context: Context, intent: Intent) {

        val dataBundle = intent.extras
        if (dataBundle != null)
            for (key in dataBundle.keySet()) {
                Log.d(TAG, "dataBundle: " + key + " : " + dataBundle.get(key))
            }
        val remoteMessage = RemoteMessage(dataBundle)
        }
    }

और इसे अपने प्रकटन में जोड़ें:

<receiver
      android:name="MY_PACKAGE_NAME.FirebaseBroadcastReceiver"
      android:exported="true"
      android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
</receiver>

OAUTH 2.0 के अनुसार:

OAUTH 2 का उपयोग करके अब इस मामले के लिए बीसीक्यूसी FCM की प्रामाणिक समस्या होगी

इसलिए मैं फायरबेस डॉक्यूमेंटेशन पढ़ता हूं और डॉक्यूमेंटेशन के अनुसार डेटा मैसेज पोस्ट करने का नया तरीका है;

//Data should come in this format from the notification
{
  "to": "/xyz/Notifications",
  "data": {
      "key1": "title notification",
      "key2": "description notification"
  }
}

हेडर

  @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
      String key1Data = remoteMessage.getData().get("key1");
      // use key1Data to according to your need
    }

प्रमाणीकरण

@Override
public void onNewToken(String token) {
    Log.d(TAG, "Refreshed token: " + token);

}

उदाहरण बॉडी

<service android:name=".service.MyFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

Url में डेटाबेस Id है जिसे आप अपने फायरबेस कंसोल पर पा सकते हैं। (प्रोजेक्ट सेट्टिंग पर जाएं)

और अब हमारा टोकन ले सकते हैं (यह केवल 1 घंटा मान्य होगा):

फायरबेस कंसोल में सबसे पहले, सेटिंग्स> सेवा खाते खोलें । नई निजी कुंजी जनरेट करें क्लिक करें , JSON फ़ाइल को सुरक्षित रूप से कुंजी के साथ संग्रहीत करें। मुझे मैन्युअल रूप से सर्वर अनुरोधों को अधिकृत करने के लिए इस JSON फ़ाइल की आवश्यकता थी। मैंने इसे डाउनलोड किया।

फिर मैं एक नोड.जेएस प्रोजेक्ट बनाता हूं और इस फ़ंक्शन का उपयोग अपने टोकन प्राप्त करने के लिए करता हूं;

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/ic_notification" />

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/colorAccent" />

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/push_channel" />

अब मैं अपने पोस्ट अनुरोध में इस टोकन का उपयोग कर सकता हूं। तब मैं अपना डेटा संदेश पोस्ट करता हूं, और अब यह मेरे ऐप्स onMessageReceived फ़ंक्शन द्वारा नियंत्रित किया जाता है।


जुलाई 2019 तक कार्य करना

Android compileSdkVersion 28, buildToolsVersion 28.0.3 और फायरबेस-मैसेजिंग: 19.0.1

अन्य सभी स्टैकऑवरफ्लो प्रश्नों और उत्तरों के माध्यम से कई घंटों के शोध के बाद, और असंख्य आउटडेटेड समाधानों को आज़माने के बाद, यह समाधान इन 3 परिदृश्यों में सूचनाएँ दिखाने में कामयाब रहा:

- ऐप अग्रभूमि में है:
अधिसूचना MyMirebaseMessagingService वर्ग पर onMessageReceived विधि द्वारा प्राप्त की गई है

- ऐप को मार दिया गया है (यह पृष्ठभूमि में नहीं चल रहा है): अधिसूचना एफसीएम द्वारा स्वचालित रूप से अधिसूचना ट्रे को भेजी जाती है। जब उपयोगकर्ता अधिसूचना को छूता है, तो एप्लिकेशन को उस गतिविधि को कॉल करके लॉन्च किया जाता है जिसमें प्रकट में android.intent.category.LAUNCHER है। आप onCreate () पद्धति पर getIntent ()। GetExtras () का उपयोग करके अधिसूचना का डेटा भाग प्राप्त कर सकते हैं।

- ऐप पृष्ठभूमि में है: अधिसूचना एफसीएम द्वारा स्वचालित रूप से अधिसूचना ट्रे को भेजी जाती है। जब उपयोगकर्ता अधिसूचना को छूता है तो ऐप को गतिविधि में लॉन्च करके अग्रभूमि में लाया जाता है, जिसमें प्रकट में android.intent.category.LAUNCHER है। जैसा कि मेरे ऐप ने लॉन्च किया है उस गतिविधि में "सिंगल = टॉप", ऑनक्रिएट () विधि को नहीं कहा जाता है क्योंकि उसी वर्ग की एक गतिविधि पहले से ही बनाई गई है, इसके बजाय उस वर्ग का ऑन-एंटेंट () विधि कहा जाता है और आपको डेटा का हिस्सा मिलता है अभिप्रेरणा .getExtras () का उपयोग करके वहां सूचना।

चरण: 1- यदि आप अपने ऐप की मुख्य गतिविधि को इस तरह परिभाषित करते हैं:

<?php
$url = "https://fcm.googleapis.com/fcm/send";
$token = "C-l6T_a7HouUK****";
$serverKey = "AAAAaOcKS00:********";
define( 'API_ACCESS_KEY', $serverKey );
$registrationIds = array($token);
// prep the bundle

$msg = array

(
 'message'  => 'here is a message. message',
 'title'        => 'This is a title. title',
 'subtitle' => 'This is a subtitle. subtitle',
 'tickerText'   => 'Ticker text here...Ticker text here...Ticker text 
 here',
 'vibrate'  => 1,
 'sound'        => 1,
 'largeIcon'    => 'large_icon',
 'smallIcon'    => 'small_icon'

);

$fields = array

(
  'registration_ids'    => $registrationIds,
  'data'            => $msg

);
$headers = array

(
  'Authorization: key=' . API_ACCESS_KEY,
 'Content-Type: application/json'

);


$ch = curl_init();

curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' 
);

curl_setopt( $ch,CURLOPT_POST, true );

curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );

curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );

curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );

curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );

$result = curl_exec($ch );

curl_close( $ch );

echo $result;

?>

2- अपने मेनऐक्टिविटी.क्लास की ऑनक्रिएट () विधि में इन पंक्तियों को जोड़ें

public class MyFirebaseMessagingService extends FirebaseMessagingService     {

  private static final String TAG = "MyFirebaseMsgService";

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    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());

      sendNotification(remoteMessage.getData().get("message"));
     }
   // Check if message contains a notification payload.
    else if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    sendNotification(remoteMessage.getNotification().getBody());
    }


}
   private void sendNotification(String messageBody) {
    Intent intent = new Intent(this, Notify.class).putExtra("msg",messageBody);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    String channelId = "idddd";
    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(MyFirebaseMessagingService.this)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle("FCM Message")
                    .setContentText(messageBody)
                    .setAutoCancel(true)
                    .setSound(defaultSoundUri)
                    .setContentIntent(pendingIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}

और एक ही MainActivity.class करने के लिए ये तरीके:

{
  "data":{
    "id": 1,
    "missedRequests": 5
    "addAnyDataHere": 123
  },
  "to": "fhiT7evmZk8:APA91bFJq7Tkly4BtLRXdYvqHno2vHCRkzpJT8QZy0TlIGs......"
}

3- इस तरह से MyFirebase क्लास बनाएं:

Object obj = message.getData().get("id");
        if (obj != null) {
            int id = Integer.valueOf(obj.toString());
        }

4- इस तरह एक नया वर्ग NotificationActivity.class बनाएं:

{ "data": {
    "image": "https://static.pexels.com/photos/4825/red-love-romantic-flowers.jpg",
    "message": "Firebase Push Message Using API"
    "AnotherActivity": "True"
     },
  "to" : "device id Or Device token"
}

}

5- इन पंक्तियों को अपने टैग्स के अंदर, अपने ऐप मेनिफेस्ट में जोड़ें

const message = {
    token: token_id,   // obtain device token id by querying data in firebase
    data: {
       title: "my_custom_title",
       body:  "my_custom_body_message"
       }
    }


return admin.messaging().send(message).then(response => {
    // handle response
});

6- इन पंक्तियों को अपने Application.java onCreate () विधि में, या MainActivity.class onCreate () विधि में जोड़ें:

if (data != null) {
  Log.d(TAG, "data title is: " + data.get("title");
  Log.d(TAG, "data body is: " + data.get("body");
}

// build notification using the body, title, and whatever else you want.

किया हुआ।

अब 3 उल्लिखित परिदृश्यों में अच्छी तरह से काम करने के लिए, आपको निम्नलिखित तरीके से फायरबेस वेब कंसोल से अधिसूचना भेजनी होगी:

अधिसूचना अनुभाग में: अधिसूचना शीर्षक = अधिसूचना संवाद (वैकल्पिक) अधिसूचना पाठ में प्रदर्शित करने के लिए शीर्षक = उपयोगकर्ता को दिखाने के लिए संदेश (आवश्यक) फिर लक्ष्य अनुभाग में: ऐप = आपका एंड्रॉइड ऐप और अतिरिक्त विकल्प अनुभाग में: Android अधिसूचना चैनल = default_channel_id कस्टम डेटा कुंजी: शीर्षक मान: (अधिसूचना अनुभाग के शीर्षक क्षेत्र की तुलना में यहां एक ही पाठ) कुंजी: शरीर का मूल्य: (अधिसूचना अनुभाग के संदेश क्षेत्र की तुलना में यहां एक ही पाठ) कुंजी: क्लिक_एक्शन मूल्य: .MainActivity साउंड। = विकलांग की
समाप्ति = 4 सप्ताह

आप Google Play के साथ एपीआई 28 के साथ एमुलेटर में इसे डिबग कर सकते हैं।

हैप्पी कोडिंग!


@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

}

हर बार यह नहीं कहा जाता है कि यह केवल तभी कहा जाता है जब ऐप भूमिगत में हो

हर बार इस पद्धति को ओवरराइड विधि कहा जाता है, चाहे कोई भी ऐप अग्रभूमि में या पृष्ठभूमि में हो या मार दिया गया हो, लेकिन यह विधि इस फ़ायरबेस एपी संस्करण के साथ उपलब्ध है

यह वह संस्करण है जिसे यूपीएल से आयात किया जाना है

compile 'com.google.firebase:firebase-messaging:10.2.1'

यह विधि है

@Override
public void handleIntent(Intent intent) {
    super.handleIntent(intent);

    // you can get ur data here 
    //intent.getExtras().get("your_data_key") 


}

पिछले फायरबेस एपी के साथ यह तरीका ऐसा नहीं था, जब ऐप बैकग्राउंड में होने पर फायर बेस खुद को संभाल लेता है .... अब यू के पास यह तरीका है कि आप कभी भी क्या करना चाहते हैं ... यू इसे इस तरीके से कर सकते हैं .. ...

यदि आप पिछले संस्करण का उपयोग कर रहे हैं, तो डिफ़ॉल्ट गतिविधि उस स्थिति में शुरू हो जाएगी जब यू को उसी तरह डेटा मिल सकता है

if(getIntent().getExtras() != null && getIntent().getExtras().get("your_data_key") != null) {
String strNotificaiton = getIntent().getExtras().get("your_data_key").toString();

// क्या तुम कभी चाहते हो ....}

आम तौर पर यह सर्वर से संरचना होती है जो हमें अधिसूचना में मिलती है

{
    "notification": {
        "body": "Cool offers. Get them before expiring!",
        "title": "Flat 80% discount",
        "icon": "appicon",
        "click_action": "activity name" //optional if required.....
    },
    "data": {
        "product_id": 11,
        "product_details": "details.....",
        "other_info": "......."
    }
}

यह यू पर निर्भर है कि आप उस डेटा कुंजी को कैसे देना चाहते हैं या यू नोटिफिकेशन देना चाहते हैं और कुछ भी यू दे सकते हैं ....... जो कभी यू यहां देगा उसी कुंजी के साथ आपको वह डेटा मिलेगा ........ ।

ऐसे कुछ मामले हैं यदि उर उस मामले में क्लिक कार्रवाई नहीं भेज रहा है जब यू अधिसूचना सूचना पर क्लिक करेगा तो डिफ़ॉल्ट गतिविधि खुलेगी, लेकिन यदि आप अपनी विशिष्ट गतिविधि को खोलना चाहते हैं जब ऐप पृष्ठभूमि में है तो आप अपनी गतिविधि को इस से संभाल सकते हैं क्योंकि यह विधि नहीं है क्योंकि हर बार कहा जाता है


      // notifications channel creation
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      // Create channel to show notifications.
      String channelId = getResources().getString("default_channel_id");
      String channelName = getResources().getString("General announcements");
      NotificationManager notificationManager = getSystemService(NotificationManager.class);
      notificationManager.createNotificationChannel(new NotificationChannel(channelId,
              channelName, NotificationManager.IMPORTANCE_LOW));
  }




firebase-cloud-messaging