android - Firebase FCM नोटिफिकेशन click_action पेलोड




android-notifications firebase-cloud-messaging (6)

अब फायरबेस कंसोल में क्लिक_एक्शन सेट करना संभव है। आप बस सूचनाएँ-संदेश-उन्नत विकल्प पर जाएँ और वहाँ आपके पास कुंजी और मान के लिए दो फ़ील्ड होंगे। पहले क्षेत्र में आपने क्लिक_एक्शन डाला और दूसरे में आपने कुछ पाठ डाला जो उस क्रिया के मूल्य को दर्शाता है। और आप अपने घोषणापत्र में आशय-फ़िल्टर जोड़ते हैं और उसे वैसा ही मान देते हैं जैसा आपने कंसोल में लिखा था। और वह वास्तविक click_action का अनुकरण है।

मैं एक विशेष गतिविधि को खोलने की कोशिश कर रहा हूं जब उपयोगकर्ता पृष्ठभूमि में ऐप पर अधिसूचना पर क्लिक करता है। डॉक्स से, मुझे यह पता चला है कि ऐप को संभालने के लिए पेलोड और एक इरादे के फिल्टर में क्लिक_एक्शन को जोड़ना होगा। लेकिन, Firebase Console के माध्यम से Firebase सूचनाओं में click_action कैसे जोड़ें? मैं किसी अन्य कार्य के आसपास भी खुला हूँ। अग्रिम में धन्यवाद।


आप FirebaseMessagingService का विस्तार करते हुए अपनी सेवा में OnMessageReceived () में अपने संदेश के कार्य में अपने सभी कार्यों को संभाल सकते हैं। ऐसा करने के लिए, आपको क्रोम में उदाहरण के लिए उन्नत REST क्लाइंट का उपयोग करके, विशेष रूप से डेटा वाला एक संदेश भेजना होगा। फिर आप "रॉ हेडर" का उपयोग करके https://fcm.googleapis.com/fcm/send को एक पोस्ट भेजते हैं:

सामग्री-प्रकार: आवेदन / json प्राधिकरण: कुंजी = your_PERSONAL_FIREBASE_WEB_APB_KEY

और "रॉ पेलोड" क्षेत्र में एक संदेश संदेश।

चेतावनी, अगर आपके json में फ़ील्ड "सूचना" है, तो आपका संदेश कभी भी ऑन नहीं होगा जब onMessageReceived () में बैकग्राउंड में ऐप होता है, भले ही डेटा फ़ील्ड हो! उदाहरण के लिए, ऐसा करना, संदेश काम करता है यदि ऐप अग्रभूमि में:

{
    "condition": " 'Symulti' in topics || 'SymultiLite' in topics",
    "priority" : "normal",
    "time_to_live" : 0,
    "notification" : {
        "body" : "new Symulti update !",
        "title" : "new Symulti update !",
        "icon" : "ic_notif_symulti"
    },
    "data" : {
        "id" : 1,
        "text" : "new Symulti update !"
    }
}

OnMessageReceived () में सभी मामलों में अपना संदेश प्राप्त करने के लिए, बस अपने नोटिफिकेशन को "" अपने क्षेत्र से हटा दें!

उदाहरण:

{
    "condition": " 'Symulti' in topics || 'SymultiLite' in topics",
    "priority" : "normal",
    "time_to_live" : 0,,
    "data" : {
        "id" : 1,
        "text" : "new Symulti update !",
        "link" : "href://www.symulti.com"
    }
}

और अपने FirebaseMessagingService में:

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private static final String TAG = "MyFirebaseMsgService";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
      String message = "";
      obj = remoteMessage.getData().get("text");
      if (obj != null) {
        try {
          message = obj.toString();
        } catch (Exception e) {
          message = "";
          e.printStackTrace();
        }
      }

      String link = "";
      obj = remoteMessage.getData().get("link");
      if (obj != null) {
        try {
          link = (String) obj;
        } catch (Exception e) {
          link = "";
          e.printStackTrace();
        }
      }

      Intent intent;
      PendingIntent pendingIntent;
      if (link.equals("")) { // Simply run your activity
        intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      } else { // open a link
        String url = "";
        if (!link.equals("")) {
          intent = new Intent(Intent.ACTION_VIEW);
          intent.setData(Uri.parse(link));
          intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        }
      }
      pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
          PendingIntent.FLAG_ONE_SHOT);


      NotificationCompat.Builder notificationBuilder = null;

      try {
        notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.ic_notif_symulti)          // don't need to pass icon with your message if it's already in your app !
            .setContentTitle(URLDecoder.decode(getString(R.string.app_name), "UTF-8"))
            .setContentText(URLDecoder.decode(message, "UTF-8"))
            .setAutoCancel(true)
            .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
            .setContentIntent(pendingIntent);
        } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
        }

        if (notificationBuilder != null) {
          NotificationManager notificationManager =
              (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
          notificationManager.notify(id, notificationBuilder.build());
        } else {
          Log.d(TAG, "error NotificationManager");
        }
      }
    }
}

का आनंद लें !


जहां तक ​​मैं बता सकता हूं, इस समय कंसोल में क्लिक_एक्शन सेट करना संभव नहीं है।

कंसोल में क्लिक_ऐक्शन कैसे प्राप्त करें, इस बारे में कोई सख्त जवाब नहीं है, आप विकल्प के रूप में कर्ल का उपयोग कर सकते हैं:

curl --header "Authorization: key=<YOUR_KEY_GOES_HERE>" --header Content-Type:"application/json" https://fcm.googleapis.com/fcm/send  -d "{\"to\":\"/topics/news\",\"notification\": {\"title\": \"Click Action Message\",\"text\": \"Sample message\",\"click_action\":\"OPEN_ACTIVITY_1\"}}"

यह click_action मैपिंग का परीक्षण करने का एक आसान तरीका है। इसमें एफसीएम डॉक्स में निर्दिष्ट एक जैसे एक इरादे वाले फिल्टर की आवश्यकता होती है:

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

यह दर्शकों को सेट करने के लिए विषयों का उपयोग भी करता है। इसे काम करने के लिए आपको "समाचार" नामक विषय की सदस्यता लेनी होगी।

FirebaseMessaging.getInstance().subscribeToTopic("news");

भले ही कंसोल में एक नव-निर्मित विषय को देखने के लिए कई घंटे लगते हैं, फिर भी आप एफसीएम एपिस के माध्यम से इसे संदेश भेज सकते हैं।

इसके अलावा, ध्यान रखें, यह केवल तभी काम करेगा जब ऐप बैकग्राउंड में हो। यदि यह अग्रभूमि में है तो आपको FirebaseMessagingService का विस्तार लागू करना होगा। OnMessageReceived विधि में, आपको मैन्युअल रूप से अपने click_action लक्ष्य पर नेविगेट करना होगा:

    @Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    //This will give you the topic string from curl request (/topics/news)
    Log.d(TAG, "From: " + remoteMessage.getFrom());
    //This will give you the Text property in the curl request(Sample Message): 
    Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody());
    //This is where you get your click_action 
    Log.d(TAG, "Notification Click Action: " + remoteMessage.getNotification().getClickAction());
    //put code here to navigate based on click_action
}

जैसा कि मैंने कहा, इस समय मुझे कंसोल के माध्यम से अधिसूचना पेलोड संपत्तियों तक पहुंचने का रास्ता नहीं मिल रहा है, लेकिन मुझे लगा कि यह काम आस-पास सहायक हो सकता है।


मुझे लग रहा है कि यह Firebase है, Google क्लाउड मैसेजिंग पुश नोटिफिकेशन फंडामेंटल से डेवलपमेंट है इसलिए हम फायरबस में gcm ट्यूटोरियल, फंक्शन एंड इम्प्लीमेंटेशन का उपयोग कर सकते हैं, मैं इस क्लिक_ऐक्शन प्रॉब्लम को हल करने के लिए gcm पुश नोटिफिकेशन फंक्शन का उपयोग कर रहा हूं।

'Notificationclick'

** इस url click_action को वेरिएबल url में सेव करने का प्रयास करें, यह सर्वर-वर्कर में है

var url =  "";

messaging.setBackgroundMessageHandler(function(payload) {

  console.log('[firebase-messaging-sw.js] Received background message ', payload);
  // Customize notification here
  url = payload.data.click_action;

  const notificationTitle = payload.data.title;
  const notificationOptions = {
    body: payload.data.body , 
    icon: 'firebase-logo.png'
  };

  return self.registration.showNotification(notificationTitle,
      notificationOptions);

});


   //i got this in google cloud messaging push notification


self.addEventListener('notificationclick', function (event) {
  event.notification.close();

  var clickResponsePromise = Promise.resolve();
    clickResponsePromise = clients.openWindow(url);

  event.waitUntil(Promise.all([clickResponsePromise, self.analytics.trackEvent('notification-click')]));
});

यदि आपका ऐप पृष्ठभूमि में है, तो Firebase onMessageReceived () को ट्रिगर नहीं करेगा। क्यूं कर.....? मुझे पता नहीं है। इस स्थिति में, मुझे FirebaseMessagingService को लागू करने का कोई मतलब नहीं दिखता है।

डॉक्स के अनुसार, यदि आप बैकग्राउंड मैसेज के आगमन की प्रक्रिया करना चाहते हैं, तो आपको अपने संदेश के साथ 'click_action' भेजना होगा। लेकिन यह संभव नहीं है यदि आप फायरबेस कंसोल से संदेश भेजते हैं, केवल फायरबेस एपीआई के माध्यम से। इसका मतलब है कि आपको अपने "कंसोल" का निर्माण करना होगा ताकि विपणन लोगों को इसका उपयोग करने में सक्षम बनाया जा सके। तो, इससे फायरबेस कंसोल भी काफी बेकार हो जाता है!

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

मुझे लगता है कि हमें नए संस्करणों और सुधारों / सुधारों की प्रतीक्षा करनी होगी!


यह वर्कअराउंड श्रेणी में आता है, जिसमें कुछ अतिरिक्त जानकारी भी होती है:

चूंकि एप्लिकेशन की स्थिति (अग्रभूमि / पृष्ठभूमि / लॉन्च नहीं) के आधार पर सूचनाओं को अलग-अलग तरीके से नियंत्रित किया जाता है। मैंने एक सहायक वर्ग को लागू करने का सबसे अच्छा तरीका देखा है, जहां अधिसूचना संदेश में भेजे गए कस्टम डेटा के आधार पर चयनित गतिविधि लॉन्च की गई है।

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

इस तरह आपको इसके लिए click_action या आशय फ़िल्टर की आवश्यकता नहीं है। इसके अलावा आप सिर्फ एक बार कोड लिखें और किसी भी गतिविधि को आसानी से शुरू कर सकते हैं।

तो न्यूनतम कस्टम डेटा कुछ इस तरह दिखाई देगा:

Key: run_activity
Value: com.mypackage.myactivity

और इसे संभालने के लिए कोड:

if (intent.hasExtra("run_activity")) {
    handleFirebaseNotificationIntent(intent);
}


private void handleFirebaseNotificationIntent(Intent intent){
    String className = intent.getStringExtra("run_activity");
    startSelectedActivity(className, intent.getExtras());
}

private void startSelectedActivity(String className, Bundle extras){
    Class cls;
    try {
        cls = Class.forName(className);
    }catch(ClassNotFoundException e){
        ...
    }
    Intent i = new Intent(context, cls);

    if (i != null) {
        i.putExtras(extras);
        this.startActivity(i);
    } 
}

यह पिछले दो मामलों के लिए कोड है, startSelectedActivity onMessageReceived (पहला मामला) से भी कहा जाएगा।

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





firebase-notifications