आप CURL के माध्यम से सभी उपकरणों में फायरबेस अधिसूचना कैसे भेजते हैं?


85

मैं सभी ऐप उपयोगकर्ताओं (एंड्रॉइड पर) के लिए एक अधिसूचना भेजने का प्रयास कर रहा हूं, अनिवार्य रूप से डुप्लिकेट को फायरबस व्यवस्थापक कंसोल के माध्यम से भेजे जाने पर क्या होता है। यहाँ CURL कमांड है जिसकी मैं शुरुआत करता हूं:

curl --insecure --header "प्राधिकरण: कुंजी = AIzaSyBidmyauthkeyisfineL-6NcJxj-1JUvEM" --header "सामग्री-प्रकार: आवेदन / json" -d "{\" अधिसूचना \ ": {\" शीर्षक \ ": \" नोट ”। -टाइटल \ ", \" बॉडी \ ": \" नोट-बॉडी \ "}}" https://fcm.googleapis.com/fcm/send

यहाँ बताया गया है कि JSON ने आपकी आँखों के लिए आसान होने का मार्ग प्रशस्त किया:

{
"notification":{
    "title":"note-Title",
    "body":"note-Body"
    }
}

प्रतिक्रिया जो वापस आती है वह सिर्फ दो वर्ण है:

सेवा

यही है, शब्द "को"। (हेडर एक 400 की रिपोर्ट करते हैं) मुझे संदेह है कि यह मेरे JSON में "से" नहीं होने के साथ है। एक "भी" के लिए क्या रखा जाएगा? मेरे पास कोई विषय निर्धारित नहीं है, और उपकरणों ने किसी भी चीज़ के लिए खुद को पंजीकृत नहीं किया है। फिर भी, वे अभी भी फायरबेस व्यवस्थापक पैनल से सूचनाएं प्राप्त करने में सक्षम हैं।

मैं "डेटा केवल" JSON पैकेज का प्रयास करना चाहता हूं, क्योंकि फायरबेज़ नोटिफिकेशन प्रोसेसिंग की अद्भुत सीमा के कारण यदि आपका ऐप अग्रभूमि में है, तो सूचना आपके हैंडलर द्वारा संसाधित हो जाती है, लेकिन यदि आपका ऐप पृष्ठभूमि में है, तो यह हो जाता है फायरबेस सेवा द्वारा आंतरिक रूप से संसाधित किया गया और कभी भी आपके सूचना हैंडलर को नहीं दिया गया। यदि आप एपीआई के माध्यम से अपना अधिसूचना अनुरोध सबमिट करते हैं, तो केवल इसके आसपास ही काम किया जा सकता है, लेकिन केवल यदि आप इसे केवल डेटा के साथ करते हैं। (जो तब एक ही संदेश के साथ आईओएस और एंड्रॉइड को संभालने की क्षमता को तोड़ता है।) मेरे किसी भी JSON में "डेटा" के साथ "अधिसूचना" को बदलने का कोई प्रभाव नहीं है।

ठीक है, तो मैंने यहां समाधान का प्रयास किया: फायरबेस जावा सर्वर सभी डिवाइसों को पुश नोटिफिकेशन भेजने के लिए जो मुझे लगता है कि "ठीक है, भले ही व्यवस्थापक कंसोल के माध्यम से सभी को सूचनाएं संभव हैं ... यह वास्तव में एपीआई के माध्यम से संभव नहीं है। " वर्कअराउंड प्रत्येक क्लाइंट को किसी विषय की सदस्यता लेने के लिए है, और फिर उस विषय पर अधिसूचना को बाहर करें। तो पहले कोड onCreate में:

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

फिर नया JSON मैं भेजें:

{
"notification":{
    "title":"note-Title",
    "body":"note-Body"
    },
"to":"allDevices"
}

इसलिए अब मुझे सर्वर से वास्तविक प्रतिक्रिया मिल रही है। JSON प्रतिक्रिया:

{
"multicast_id":463numbersnumbers42000,
"success":0,
"failure":1,
"canonical_ids":0,
"results":
    [
    {
    "error":"InvalidRegistration"
    }
    ]
}

और यह HTTP कोड 200 के साथ आता है। ठीक है ... https://firebase.google.com/docs/cloud-messaging/http-server-ref के अनुसार "InvalidRegademy" के साथ 200 कोड का मतलब पंजीकरण टोकन के साथ एक समस्या है । शायद? क्योंकि प्रलेखन का वह हिस्सा मैसेजिंग सर्वर के लिए है। क्या अधिसूचना सर्वर एक ही है? अस्पष्ट। मैं कहीं और देखता हूं कि सक्रिय होने से पहले घंटे लग सकते हैं। ऐसा लगता है कि नए चैट रूम बनाने के लिए यह बेकार हो जाएगा, इसलिए ऐसा लगता है कि यह भी बंद है।

जब मैं स्क्रैच से एक ऐप को कोड कर सकता था तो मैं बहुत उत्साहित था, जिसे कुछ ही घंटों में सूचनाएं मिलीं जब मैंने पहले कभी Firebase का उपयोग नहीं किया था। ऐसा लगता है कि स्ट्राइप.कॉम डॉक्यूमेंटेशन के लेवल पर पहुंचने से पहले इसे लंबा रास्ता तय करना है।

नीचे पंक्ति: क्या किसी को पता है कि एडमिन कंसोल की कार्यक्षमता को मिरर करने के लिए ऐप चलाने वाले सभी उपकरणों को संदेश भेजने के लिए JSON को क्या आपूर्ति करनी है?


अपने एपीआई टोकन की जांच करें जो आप उपयोग कर रहे हैं वह सही है। जीसीएम संदेश को एकल डिवाइस पर भेजने का प्रयास करें और देखें कि क्या काम करता है। आप डिबग में ऐप शुरू करके InstanceId प्राप्त कर सकते हैं और एक ब्रेकपॉइंट लगा सकते हैंFirebaseInstanceIdService
जस्टिन स्लेड

मुझे "api token" नहीं दिख रहा है, जो कि फायरबस.google.com/docs की त्वरित Google खोज में दिखाई दे रहा है। क्या आपका मतलब "आईडी टोकन" है? या "प्रामाणिक टोकन"? या आप हेडर में आपूर्ति के रूप में मेरी प्राधिकरण कुंजी के बारे में बात कर रहे हैं? एक है कि है ठीक: अगर मैं इसे यह क्या है से बदलने के लिए, सर्वर प्रतिक्रिया मैं वर्तमान में हो रही है त्रुटि संदेश के बजाय "अनधिकृत" में चला जाएगा।
एंडर्स

यह ब्लॉग किसी विशेष उपकरण को संदेश भेजने के बारे में प्रतीत होता है, न कि मूल चर्चा के रूप में, इसे ऐप के सभी उपयोगकर्ताओं को भेजने के बारे में।
एंडर्स 8

अधिक जानकारी के लिए इस ब्लॉगपोस्ट को पढ़ें -> developine.com/…
विकासशील

जवाबों:


56

संपादित करें: ऐसा प्रतीत होता है कि यह विधि अब समर्थित नहीं है (@FernandoZamperin के लिए)। कृपया अन्य उत्तरों पर एक नज़र डालें!

किसी विषय की सदस्यता लेने के बजाय आप conditionकुंजी का उपयोग कर सकते हैं और उदाहरणों को संदेश भेज सकते हैं, जो समूह में नहीं हैं। आपका डेटा कुछ इस तरह दिख सकता है:

{
    "data": {
        "foo": "bar"
    },
    "condition": "!('anytopicyoudontwanttouse' in topics)"
}

Https://firebase.google.com/docs/cloud-messaging/send-message#send_messages_to_topics_2 देखें


3
यह सबसे अच्छा जवाब है। इसे ऐप अपडेट की आवश्यकता के बिना तुरंत चलाया जा सकता है। महान!
टॉम मार्वोलो रिडल

अंत में पाया गया कि एक - उन्हें वास्तव में इसका अधिक स्पष्ट उपयोग करना चाहिए
cwiesner

यह आशाजनक लग रहा है लेकिन क्या यह वास्तव में काम करता है? यह एक हैक की तरह दिखता है। मैंने इसे एक नमूना परियोजना पर आजमाया और यह काम करता है। हालांकि, मुझे यकीन नहीं है कि यह मेरे ठेस ऐप के साथ काम करेगा जिसमें हजारों सक्रिय उपयोगकर्ता हैं। क्या किसी ने इसे एक ठेस एप्लिकेशन के साथ आज़माया है?
साहिल पटेल

4
मैं काफी समय से इस दृष्टिकोण का उपयोग कर रहा था और पूरी तरह से काम कर रहा था, आज किसी कारण से मैं विरासत के लिए अधिसूचना भेजता हूं, यह मुझे बिना किसी त्रुटि के मैसेज_ड रिटर्न देता है, लेकिन उपकरणों को पुश सूचनाएं प्राप्त नहीं हो रही हैं, कोई भी अनुमान लगाता है कि क्या होगा मुसीबत? एक ही टोकन के लिए भेजा गया परीक्षण और यह सामान्य रूप से काम करता है।
फर्नांडो ज़म्परिन

1
@VitVeres मैंने फ़ायरबेस सपोर्ट टीम को एक समस्या भेजी और उन्होंने मुझे जवाब दिया: "पुशआउट नोटिफिकेशन को एक्सप्रेशन देने के लिए आपके वर्तमान उपयोग का समर्थन नहीं है। कृपया सुनिश्चित करें कि एक्सप्रेशन में सूचीबद्ध विषय आपके ऐप प्रोजेक्ट के लिए मौजूद हैं।" लगता है कि मुझे अपने ऐप्स में विषय लागू करने होंगे।
फर्नांडो जम्परिन

98

फायरबेस नोटिफिकेशन में संदेश भेजने के लिए एपीआई नहीं है। सौभाग्य से यह फायरबेस क्लाउड मैसेजिंग के शीर्ष पर बनाया गया है, जिसमें ठीक ऐसी एपीआई है।

फायरबेस नोटिफिकेशन और क्लाउड मैसेजिंग के साथ, आप तथाकथित डाउनस्ट्रीम संदेशों को तीन तरीकों से उपकरणों पर भेज सकते हैं:

  1. विशिष्ट उपकरणों के लिए , यदि आप उनकी डिवाइस आईडी जानते हैं
  2. उपकरणों के समूहों के लिए , यदि आप समूहों के पंजीकरण आईडी जानते हैं
  3. विषयों के लिए , जो सिर्फ कुंजी है कि उपकरणों की सदस्यता ले सकते हैं

आप ध्यान देंगे कि स्पष्ट रूप से सभी उपकरणों को भेजने का कोई तरीका नहीं है। आप इनमें से प्रत्येक के साथ इस तरह की कार्यक्षमता का निर्माण कर सकते हैं, उदाहरण के लिए: जब यह शुरू होता है (उदाहरण के लिए /topics/all) या सभी डिवाइस आईडी की सूची रखकर, और फिर उन सभी को संदेश भेजकर ऐप को किसी विषय की सदस्यता देकर ।

एक विषय पर भेजने के लिए आपके पास अपने कमांड में एक वाक्यविन्यास त्रुटि है। विषयों की पहचान शुरुआत से होती है /topics/। चूंकि आपके पास आपके कोड में ऐसा नहीं है, इसलिए सर्वर allDevicesडिवाइस आईडी के रूप में व्याख्या करता है। चूंकि यह डिवाइस पंजीकरण टोकन के लिए एक अमान्य प्रारूप है, इसलिए यह एक त्रुटि उठाता है।

विषयों पर संदेश भेजने के लिए प्रलेखन से:

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to": "/topics/foo-bar",
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}

मैंने {"to": "/ topic / allDevices", "data": {"message" प्रस्तुत करने का प्रयास किया: "यह एक फायरबेस क्लाउड मैसेजिंग टॉपिक संदेश है!"} और उसी InvalidRegademy की प्रतिक्रिया प्राप्त की। मेरा मानना ​​है कि इसका मतलब यह है कि विषय मान्य नहीं है। मैं सांत्वना में विषयों के डेटाबेस को देखने का कोई तरीका नहीं देखता।
एंडर्स

7
/topics/बहुवचन है
फ्रैंक वैन पफेलन

बनावटी हंसी ओह, गलत वर्तनी, प्रोग्रामर का अभिशाप। ;) नई प्रतिक्रिया है: {"message_id": 5115052numbers95180} जो निश्चित रूप से बहुत अधिक सफल दिखता है। तो, नीचे की पंक्ति की तरह लगता है कि जब "सूचना" के माध्यम से सूचनाएं देने के लिए व्यवस्थापक कंसोल से एक शक्ति कार्यक्षमता होती है, तो एपीआई प्रस्तुतियाँ से कोई रास्ता ट्रिगर नहीं होता है, और किसी को केवल संदेशों का उपयोग करने के लिए खुद को परिवर्तित करना चाहिए। (अधिसूचना में निर्मित शेड्यूलिंग और रूपांतरण ट्रैकिंग को खोना) मैं प्राप्त करने के लिए मैसेजिंग कोड की तलाश करूंगा। धन्यवाद फ्रैंक। :)
एंडर्स

1
उह ... वास्तव में नहीं। सूचनाएं कंसोल केवल सूचना संदेश भेजता है ( यह संदेश प्रकारों के बारे में प्रलेखन देखें )। केवल एक चीज यह है कि हमारे पास अभी तक एक एपीआई नहीं है जो दर्शकों को भेज रहा है
फ्रैंक वैन पफेलन

1
क्या यह iOS के लिए भी ऐसा ही है? मैंने ऐसा ही प्रयास किया और ऐप के जीवित होने पर मुझे सूचना मिल रही है, लेकिन पृष्ठभूमि में यह काम नहीं करता है
vinbhai4u

73

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

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

अब अनुरोध के रूप में भेजें

{
   "to":"/topics/all",
   "data":
   {
      "title":"Your title",
      "message":"Your message"
      "image-url":"your_image_url"
   }
}

यह अक्षम या गैर-मानक तरीका हो सकता है, लेकिन जैसा कि मैंने ऊपर बताया कि यह सबसे आसान है। कृपया पोस्ट करें यदि आपके पास सभी उपकरणों पर एक पुश सूचना भेजने का कोई बेहतर तरीका है।

यदि आप फायरबेस क्लाउड मैसेजिंग ट्यूटोरियल - एफसीएम का उपयोग करके पुश नोटिफिकेशन का उपयोग करके पुश नोटिफिकेशन भेजने के लिए नए हैं, तो आप इस ट्यूटोरियल को फॉलो कर सकते हैं


विषयों के संयोजन के लिए एक संदेश भेजने के लिए , एक शर्त निर्दिष्ट करें , जो एक बूलियन अभिव्यक्ति है जो लक्ष्य विषयों को निर्दिष्ट करती है। उदाहरण के लिए, निम्न स्थिति उपकरणों कि की सदस्यता ली है करने के लिए संदेश भेज देंगे TopicAऔर या तो TopicBया TopicC:

{
   "data":
   {
      "title": "Your title",
      "message": "Your message"
      "image-url": "your_image_url"
   },
   "condition": "'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"
}

एफसीएम प्रलेखन पर शर्तों और विषयों के बारे में और पढ़ें


यह मुझे समझ में आता है। लेकिन आप की तरह, मुझे यकीन नहीं है कि यह अक्षम है। कृपया, क्या कोई इसे स्पष्ट कर सकता है?
JCarlosR

2
मुझे नहीं लगता कि यह अक्षम है, कि सभी उपकरणों को पुश अधिसूचना भेजने का एकमात्र संभव तरीका हो सकता है (मैं किसी अन्य तरीके से कम से कम नहीं पा सकता)
सैयद राफे

1
सबसे बढ़िया उत्तर! :)
27'18

2
बहुत बढ़िया जवाब। चूँकि इसका कहीं भी उल्लेख नहीं किया गया था, इसलिए यह जानना ज़रूरी है कि आपको इस तरह के संदेश प्राप्त होंगे जो Serviceकि कार्य FirebaseMessagingServiceमें विस्तार कर रहे #onMessageReceivedहैं। इसलिए अधिसूचना स्वचालित रूप से प्रदर्शित नहीं होती है आपको इसकी देखभाल स्वयं करनी होगी।
बजे

4

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


अधिक जानकारी के लिए इस ब्लॉगपोस्ट को पढ़ें -> developine.com/…
विकासशील

2

मैं अपने आयोनिक कॉर्डोवा ऐप पुश अधिसूचना के लिए समाधान देख रहा था।

सैयद रफय के जवाब के लिए धन्यवाद।

में app.component.ts

const options: PushOptions = {
  android: {
    topics: ['all']
  },

में सर्वर फ़ाइल

"to" => "/topics/all",

1

बस उन सभी उपयोगकर्ताओं को जो एक विशिष्ट विषय की सदस्यता लेते हैं, और फिर उस विषय पर एक अधिसूचना भेजें।


0

फायरबेस कंसोल पर अपनी विषय सूची की जाँच करें।

  1. फायरबेस कंसोल पर जाएं

  2. साइड मेनू से बढ़ो पर क्लिक करें

  3. क्लाउड मैसेजिंग पर क्लिक करें

  4. अपना पहला संदेश भेजें पर क्लिक करें

  5. अधिसूचना अनुभाग में, अधिसूचना शीर्षक और अधिसूचना पाठ के लिए कुछ लिखें

  6. अगला क्लिक करें

  7. लक्ष्य अनुभाग में विषय पर क्लिक करें

  8. संदेश विषय टेक्स्टबॉक्स पर क्लिक करें , फिर आप अपने विषयों को देख सकते हैं (मैंने एंड्रॉइड या आईओएस नामक विषय नहीं बनाया है, लेकिन मैं उन दो विषयों को देख सकता हूं।

  9. जब आप पुश अधिसूचना भेजते हैं तो इसे अपनी स्थिति के रूप में जोड़ें।

    विषयों में "हालत" => "'सभी' || विषयों में 'Android' || विषयों में 'ios'"

पूरा शरीर

array(
    "notification"=>array(
        "title"=>"Test",
        "body"=>"Test Body",
    ),
    "condition"=> "'all' in topics || 'android' in topics || 'ios' in topics",
);

यदि आपके पास अधिक विषय हैं, तो आप उन लोगों को जोड़ सकते हैं || (या) स्थिति, फिर सभी उपयोगकर्ताओं को आपकी सूचना मिल जाएगी। परीक्षण किया और मेरे लिए काम किया।


-4

आप "/ विषय / सभी" का उपयोग करके सभी उपकरणों को सूचना भेज सकते हैं

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to": "/topics/all",
  "notification":{ "title":"Notification title", "body":"Notification body", "sound":"default", "click_action":"FCM_PLUGIN_ACTIVITY", "icon":"fcm_push_icon" },
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}

क्या यह नई कार्यक्षमता है? या क्या इस एप्लिकेशन को "सभी" की सदस्यता लेने की आवश्यकता है?
एंडर्स 8

यह डिफ़ॉल्ट कार्यक्षमता है। मैं किसी भी विषय की सदस्यता नहीं लेता। यह मेरे लिए काम कर रहा है। लेकिन मैंने टोकन पंजीकरण किया। "getToken"
शिव करुप्पिया

1
आपको एक संदेश आईडी प्राप्त होगा, हां, लेकिन किसी भी डिवाइस पर कुछ भी नहीं भेजा जाता है जब तक कि आपके पास "सभी" नाम का एक विषय न हो।
अब्दाल्रहमान शतो

नहीं, मुझे अपने Android उपकरणों (दो) में सूचना मिली। क्या आप चाहते हैं कि मैं अपना स्क्रीन शॉट संलग्न करूं? Im ioinc के शीर्ष पर मेरे एप्लिकेशन का निर्माण।
शिवा करुप्पइया

यह मेरे लिए काम करता है। पता नहीं क्यों यह नीचा है।
m1crdy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.