मैसेज डिलीवरी को समझना

मैसेज डिलीवर न होने की समस्या को हल करने के लिए, FCM के समस्या हल करने वाले टूल का इस्तेमाल करें. साथ ही, इस ब्लॉग पोस्ट को पढ़ें. इससे आपको यह समझने में मदद मिलेगी कि मैसेज न दिखने की अलग-अलग वजहें क्या हो सकती हैं. FCM की सेवा में कोई रुकावट तो नहीं है, यह जानने के लिए FCM का स्टेटस डैशबोर्ड पर जाएं.

FCM, आपको तीन तरह के टूल भी उपलब्ध कराता है. इनकी मदद से, मैसेजिंग की सफलता और रणनीति का आकलन किया जा सकता है:

  • Firebase कंसोल मैसेज की डिलीवरी रिपोर्ट
  • Firebase Cloud Messaging Data API से, Android SDK की डिलीवरी से जुड़ी एग्रीगेट की गई मेट्रिक
  • Google BigQuery में पूरा डेटा एक्सपोर्ट करना

Firebase कंसोल में, BigQuery में डेटा एक्सपोर्ट करने और रिपोर्ट टैब, दोनों के लिए Google Analytics ज़रूरी है. Firebase कंसोल के सेटिंग > इंटिग्रेशन टैब में जाकर, Google Analytics को चालू किया जा सकता है. एग्रीगेट किया गया डिलीवरी डेटा के लिए, Google Analytics की ज़रूरत नहीं होती.

ध्यान रखें कि इस पेज पर मौजूद कई आंकड़ों की रिपोर्टिंग में 24 घंटे तक की देरी हो सकती है. ऐसा इसलिए होता है, क्योंकि Analytics डेटा को बैच में प्रोसेस किया जाता है.

मैसेज डिलीवरी की रिपोर्ट

Firebase कंसोल में, DevOps और जुड़ाव > मैसेजिंग > रिपोर्ट टैब पर जाएं. यहां आपको Android या Apple प्लैटफ़ॉर्म के FCM SDK टूल को भेजे गए मैसेज का यह डेटा दिखेगा. इसमें Notifications composer और FCM API का इस्तेमाल करके भेजे गए मैसेज भी शामिल हैं:

  • भेजे गए — डेटा मैसेज या सूचना मैसेज को डिलीवरी के लिए कतार में रखा गया है. इसके अलावा, इसे डिलीवरी के लिए APNs जैसी तीसरे पक्ष की सेवा को भेज दिया गया है. ध्यान दें कि भेजे गए मैसेज के आंकड़े अपडेट होने में कुछ घंटे लग सकते हैं. ज़्यादा जानकारी के लिए, मैसेज का लाइफ़टाइम देखें.
  • पाया गया (सिर्फ़ Android डिवाइसों पर उपलब्ध है) — ऐप्लिकेशन को डेटा मैसेज या सूचना मैसेज मिल गया है. यह डेटा तब उपलब्ध होता है, जब Android डिवाइस पर FCM SDK 18.0.1 या इसके बाद का वर्शन इंस्टॉल हो.
  • इंप्रेशन (सिर्फ़ Android डिवाइसों पर सूचना वाले मैसेज के लिए उपलब्ध) — जब ऐप्लिकेशन बैकग्राउंड में चल रहा हो, तब डिवाइस पर डिसप्ले सूचना दिखाई गई हो.
  • खोला गया — उपयोगकर्ता ने सूचना वाला मैसेज खोला. इसकी जानकारी सिर्फ़ उन सूचनाओं के लिए दी जाती है जो ऐप्लिकेशन के बैकग्राउंड में चालू होने पर मिलती हैं.

यह डेटा, सूचना पेलोड वाले सभी मैसेज और लेबल किए गए सभी डेटा मैसेज के लिए उपलब्ध होता है. लेबल के बारे में ज़्यादा जानने के लिए, मैसेज में Analytics लेबल जोड़ना लेख पढ़ें.

मैसेज की रिपोर्ट देखते समय, दिखाए गए डेटा के लिए तारीख की सीमा सेट की जा सकती है. साथ ही, इसे CSV फ़ाइल में एक्सपोर्ट किया जा सकता है. इन शर्तों के हिसाब से भी फ़िल्टर किया जा सकता है:

  • प्लैटफ़ॉर्म (iOS या Android)
  • ऐप्लिकेशन
  • ज़रूरत के मुताबिक बनाए गए Analytics लेबल

मैसेज में Analytics लेबल जोड़ना

मैसेजों को लेबल करने की सुविधा, कस्टम विश्लेषण के लिए बहुत काम की है. इससे आपको लेबल या लेबल के सेट के हिसाब से, डिलीवरी के आंकड़े फ़िल्टर करने में मदद मिलती है. एचटीटीपी v1 एपीआई का इस्तेमाल करके भेजे गए किसी भी मैसेज में लेबल जोड़ा जा सकता है. इसके लिए, message ऑब्जेक्ट में fcmOptions.analyticsLabel फ़ील्ड सेट करें. इसके अलावा, प्लैटफ़ॉर्म के हिसाब से AndroidFcmOptions या ApnsFcmOptions फ़ील्ड में भी लेबल जोड़ा जा सकता है.

Analytics लेबल, ^[a-zA-Z0-9-_.~%]{1,50}$ फ़ॉर्मैट में टेक्स्ट स्ट्रिंग होते हैं. लेबल में अंग्रेज़ी के छोटे और बड़े अक्षर, संख्याएं, और ये सिंबल शामिल किए जा सकते हैं:

  • -
  • ~
  • %

ज़्यादा से ज़्यादा 50 वर्ण इस्तेमाल किए जा सकते हैं. हर दिन ज़्यादा से ज़्यादा 100 यूनीक लेबल तय किए जा सकते हैं; अगर किसी मैसेज में तय की गई सीमा से ज़्यादा लेबल जोड़े जाते हैं, तो उसकी शिकायत नहीं की जाती.

Firebase कंसोल मैसेजिंग रिपोर्ट टैब में, मौजूदा सभी लेबल की सूची खोजी जा सकती है. साथ ही, दिखाए गए आंकड़ों को फ़िल्टर करने के लिए, इन लेबल को अलग-अलग या एक साथ लागू किया जा सकता है.

FCM Data API का इस्तेमाल करके, डिलीवरी का एग्रीगेट किया गया डेटा

Firebase क्लाउड से मैसेज Data API की मदद से, ऐसी जानकारी वापस पाई जा सकती है जिससे आपको Android ऐप्लिकेशन को टारगेट करने वाले मैसेज अनुरोधों के नतीजों को समझने में मदद मिल सकती है. यह एपीआई, प्रोजेक्ट में डेटा इकट्ठा करने की सुविधा वाले सभी Android डिवाइसों का एग्रीगेट किया गया डेटा उपलब्ध कराता है. इसमें यह जानकारी शामिल होती है कि कितने प्रतिशत मैसेज बिना किसी देरी के डिलीवर किए गए. साथ ही, Android ट्रांसपोर्ट लेयर में कितने मैसेज डिलीवर होने में देरी हुई या डिलीवर नहीं हुए. इस डेटा का आकलन करने से, मैसेज डिलीवरी के बड़े ट्रेंड का पता चल सकता है. साथ ही, इससे आपको मैसेज भेजने के अनुरोधों की परफ़ॉर्मेंस को बेहतर बनाने के असरदार तरीके ढूंढने में मदद मिल सकती है. रिपोर्ट में तारीख की सीमा की उपलब्धता के बारे में जानकारी के लिए, एग्रीगेट किए गए डेटा की टाइमलाइन देखें.

एपीआई, किसी ऐप्लिकेशन के लिए उपलब्ध सारा डेटा देता है. एपीआई के संदर्भ से जुड़े दस्तावेज़ देखें.

डेटा को कैसे बांटा गया है?

डिलीवरी के डेटा को ऐप्लिकेशन, तारीख, और Analytics लेबल के हिसाब से बांटा जाता है. एपीआई को कॉल करने पर, तारीख, ऐप्लिकेशन, और Analytics लेबल के हर कॉम्बिनेशन के लिए डेटा मिलेगा. उदाहरण के लिए, एक androidDeliveryData JSON ऑब्जेक्ट इस तरह दिखेगा:

 {
  "appId": "1:23456789:android:a93a5mb1234efe56",
  "date": {
    "year": 2021,
    "month": 1,
    "day": 1
  },
  "analyticsLabel": "foo",
  "data": {
    "countMessagesAccepted": "314159",
    "messageOutcomePercents": {
      "delivered": 71,
      "pending": 15
    },
   "deliveryPerformancePercents": {
      "deliveredNoDelay": 45,
      "delayedDeviceOffline": 11
    }
  }

मेट्रिक को समझने का तरीका

डिलीवरी डेटा से पता चलता है कि कितने प्रतिशत मैसेज, यहां दी गई हर मेट्रिक के मुताबिक हैं. ऐसा हो सकता है कि एक मैसेज कई मेट्रिक के हिसाब से सही हो. हम डेटा को किस तरह इकट्ठा करते हैं और हमने मेट्रिक को किस लेवल पर एग्रीगेट किया है, इसकी सीमाओं की वजह से, कुछ मैसेज के नतीजों को मेट्रिक में शामिल नहीं किया जाता. इसलिए, यहां दिए गए प्रतिशत का कुल योग 100% नहीं होगा.

स्वीकार किए गए मैसेज की संख्या

डेटासेट में सिर्फ़ उन मैसेज की संख्या शामिल होती है जिन्हें FCM ने Android डिवाइसों पर डिलीवर करने के लिए स्वीकार किया था. सभी प्रतिशत के लिए, इस वैल्यू का इस्तेमाल डिनॉमिनेटर के तौर पर किया जाता है. ध्यान रखें कि इस संख्या में ऐसे उपयोगकर्ताओं को टारगेट किए गए मैसेज शामिल नहीं होंगे जिन्होंने अपने डिवाइसों पर, इस्तेमाल और परफ़ॉर्मेंस से जुड़ी जानकारी इकट्ठा करने की सुविधा बंद की है.

मैसेज के नतीजे का प्रतिशत

MessageOutcomePercents ऑब्जेक्ट में शामिल फ़ील्ड, मैसेज के अनुरोधों के नतीजों के बारे में जानकारी देते हैं. सभी कैटगरी एक-दूसरे से अलग होती हैं. इससे "क्या मेरे मैसेज डिलीवर हो रहे हैं?" और "मैसेज डिलीवर न होने की वजह क्या है?" जैसे सवालों के जवाब मिल सकते हैं.

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

डिलीवरी की परफ़ॉर्मेंस के प्रतिशत

DeliveryPerformancePercents ऑब्जेक्ट में मौजूद फ़ील्ड से, उन मैसेज के बारे में जानकारी मिलती है जो सही तरीके से डिलीवर किए गए थे. इससे इन सवालों के जवाब मिल सकते हैं: "क्या मेरे मैसेज डिलीवर होने में देरी हुई?" और "मैसेज डिलीवर होने में देरी क्यों हुई?" उदाहरण के लिए, delayedMessageThrottled की ज़्यादा वैल्यू से साफ़ तौर पर पता चलेगा कि आपने हर डिवाइस के लिए तय की गई ज़्यादा से ज़्यादा सीमाएं पार कर ली हैं. इसलिए, आपको मैसेज भेजने की दर को अडजस्ट करना चाहिए.

मैसेज की अहम जानकारी के प्रतिशत

इस ऑब्जेक्ट से, भेजे गए सभी मैसेज के बारे में ज़्यादा जानकारी मिलती है. priorityLowered फ़ील्ड में, स्वीकार किए गए उन मैसेज का प्रतिशत दिखता है जिनकी प्राथमिकता को HIGH से घटाकर NORMAL कर दिया गया था. अगर यह वैल्यू ज़्यादा है, तो ज़्यादा प्राथमिकता वाले कम मैसेज भेजें या पक्का करें कि ज़्यादा प्राथमिकता वाला मैसेज भेजे जाने पर, हमेशा सूचना दिखे. मैसेज की प्राथमिकता के बारे में ज़्यादा जानकारी के लिए, हमारा दस्तावेज़ देखें

यह डेटा, BigQuery में एक्सपोर्ट किए गए डेटा से कैसे अलग है?

BigQuery एक्सपोर्ट की मदद से, हर मैसेज के लॉग मिलते हैं. इनसे पता चलता है कि FCM बैकएंड ने मैसेज स्वीकार किया है या नहीं. साथ ही, डिवाइस पर SDK में मैसेज डिलीवर हुआ है या नहीं. यह FCM आर्किटेक्चर के चरण 2 और 4 में बताया गया है. इस डेटा से यह पक्का करने में मदद मिलती है कि हर मैसेज स्वीकार किया गया है और डिलीवर किया गया है. अगले सेक्शन में, BigQuery डेटा एक्सपोर्ट के बारे में ज़्यादा जानें.

इसके उलट, Firebase क्लाउड से मैसेज Data API, Android ट्रांसपोर्ट लेयर (या FCM आर्किटेक्चर के तीसरे चरण) में होने वाली गतिविधियों के बारे में एग्रीगेट की गई जानकारी देता है. इस डेटा से, खास तौर पर FCM बैकएंड से Android SDK को मैसेज डिलीवर करने के बारे में अहम जानकारी मिलती है. यह खास तौर पर, यह दिखाने के लिए मददगार है कि इस ट्रांसपोर्ट के दौरान मैसेज क्यों देर से पहुंचे या क्यों नहीं पहुंचे.

कुछ मामलों में, ऐसा हो सकता है कि ये दोनों डेटा सेट पूरी तरह से मेल न खाएं. इसकी वजहें ये हो सकती हैं:

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

एपीआई की सीमाएं

कुल डेटा की टाइमलाइन

एपीआई, सात दिनों का पुराना डेटा दिखाएगा. हालांकि, इस एपीआई से मिलने वाले डेटा में पांच दिनों तक की देरी हो सकती है. उदाहरण के लिए, 20 जनवरी को 9 जनवरी से 15 जनवरी तक का डेटा उपलब्ध होगा. हालांकि, 16 जनवरी या उसके बाद का डेटा उपलब्ध नहीं होगा. इसके अलावा, डेटा को सबसे बेहतर तरीके से उपलब्ध कराया जाता है. डेटा आउटेज की स्थिति में, FCM आगे की ओर काम करेगा और समस्या ठीक होने के बाद डेटा को फिर से नहीं भरेगा. बड़ी रुकावटों के दौरान, डेटा एक हफ़्ते या उससे ज़्यादा समय तक उपलब्ध नहीं हो सकता.

डेटा कवरेज

Firebase क्लाउड से मैसेजिंग Data API से मिली मेट्रिक का मकसद, मैसेज डिलीवरी के सामान्य रुझानों के बारे में अहम जानकारी देना है. हालांकि, इनसे मैसेज से जुड़े सभी मामलों की पूरी कवरेज नहीं मिलती. यहां दिए गए मामलों के नतीजे, मेट्रिक में नहीं दिखते.

समयसीमा खत्म हो चुके मैसेज

अगर लॉग की तारीख खत्म होने के बाद टाइम टू लिव (टीटीएल) खत्म होता है, तो इस तारीख को मैसेज को droppedTtlExpired के तौर पर नहीं गिना जाएगा.

बंद डिवाइसों को भेजे गए मैसेज

बंद किए गए डिवाइसों पर भेजे गए मैसेज, डेटासेट में दिख सकते हैं या नहीं भी दिख सकते. यह इस बात पर निर्भर करता है कि वे किस डेटा पाथ का इस्तेमाल करते हैं. इस वजह से, droppedDeviceInactive और pending फ़ील्ड में कुछ गलतियां हो सकती हैं.

उपयोगकर्ता की कुछ खास प्राथमिकताओं वाले डिवाइसों को भेजे गए मैसेज

जिन उपयोगकर्ताओं ने अपने डिवाइसों पर, इस्तेमाल और गड़बड़ी की जानकारी इकट्ठा करने की सुविधा बंद की है उनके मैसेज को हम नहीं गिनेंगे. ऐसा उनकी प्राथमिकताओं के मुताबिक किया जाएगा.

राउंडिंग और कम से कम वैल्यू

FCM, जान-बूझकर उन मामलों में गिनती को राउंड करता है और उन्हें शामिल नहीं करता जहां वॉल्यूम काफ़ी ज़्यादा नहीं होते.

BigQuery में डेटा एक्सपोर्ट करना

ज़्यादा विश्लेषण के लिए, मैसेज के डेटा को BigQuery में एक्सपोर्ट किया जा सकता है. BigQuery की मदद से, BigQuery SQL का इस्तेमाल करके डेटा का विश्लेषण किया जा सकता है. साथ ही, इसे किसी अन्य क्लाउड सेवा देने वाली कंपनी को एक्सपोर्ट किया जा सकता है या कस्टम एमएल मॉडल के लिए डेटा का इस्तेमाल किया जा सकता है. BigQuery में एक्सपोर्ट किए गए डेटा में, मैसेज से जुड़ा उपलब्ध सारा डेटा शामिल होता है. भले ही, मैसेज का टाइप कुछ भी हो या मैसेज को एपीआई या सूचनाएं कंपोज़ करने वाले टूल का इस्तेमाल करके भेजा गया हो.

FCMएसडीके के इन वर्शन वाले डिवाइसों को भेजे गए मैसेज के लिए, आपके पास अपने ऐप्लिकेशन के लिए मैसेज डिलीवरी डेटा एक्सपोर्ट करने का विकल्प भी होता है:

  • Android 20.1.0 या इसके बाद का वर्शन.
  • iOS 8.6.0 या इसके बाद का वर्शन
  • Firebase Web SDK 12.14.0 या इसके बाद का वर्शन

शुरू करने के लिए, BigQuery कंसोल का इस्तेमाल करके अपने प्रोजेक्ट को BigQuery से लिंक करें:Firebase

  1. नीचे से कोई एक विकल्प चुनें:

    • DevOps और यूज़र ऐक्टिविटी > मैसेजिंग > सूचनाएं कंपोज़ करने की सुविधा पर जाएं. इसके बाद, पेज पर सबसे नीचे मौजूद BigQuery ऐक्सेस करें पर क्लिक करें.

    • सेटिंग > इंटिग्रेशन टैब पर जाएं. इसके बाद, BigQuery में जाकर, लिंक करें पर क्लिक करें.

      इस पेज पर, प्रोजेक्ट में FCM की सुविधा वाले सभी ऐप्लिकेशन के लिए, FCM एक्सपोर्ट करने के विकल्प दिखते हैं.

  2. BigQuery को चालू करने के लिए, स्क्रीन पर दिए गए निर्देशों का पालन करें.

ज़्यादा जानकारी के लिए, Firebase को BigQuery से लिंक करना लेख पढ़ें.

Cloud Messaging के लिए BigQuery एक्सपोर्ट करने की सुविधा चालू करने पर:

  • Firebase, BigQuery में आपका डेटा एक्सपोर्ट करता है. ध्यान दें कि एक्सपोर्ट किए जाने वाले डेटा को अपडेट होने में 48 घंटे लग सकते हैं.

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

  • Firebase, आपके Firebase प्रोजेक्ट से BigQuery में डेटा को नियमित तौर पर सिंक करता है. डेटा को हर दिन एक्सपोर्ट करने की ये प्रोसेस, सुबह 4:00 बजे पैसिफ़िक समय के हिसाब से शुरू होती है. आम तौर पर, यह प्रोसेस 24 घंटे में पूरी हो जाती है.

  • आपके प्रोजेक्ट के सभी ऐप्लिकेशन डिफ़ॉल्ट रूप से, BigQuery से लिंक होते हैं. साथ ही, बाद में प्रोजेक्ट में जोड़े जाने वाले ऐप्लिकेशन भी अपने-आप BigQuery से लिंक कर दिए जाते हैं. आपके पास BigQuery में डेटा भेजने वाले ऐप्लिकेशन चुनने का विकल्प होता है.

BigQuery एक्सपोर्ट करने की सुविधा बंद करने के लिए, Firebase कंसोल में जाकर अपने प्रोजेक्ट को अनलिंक करें.

मैसेज डिलीवरी का डेटा एक्सपोर्ट करने की सुविधा चालू करना

iOS+

iOS डिवाइसों पर FCM SDK 8.6.0 या इसके बाद के वर्शन का इस्तेमाल करने वाले लोग, अपने ऐप्लिकेशन के मैसेज डिलीवरी डेटा को एक्सपोर्ट करने की सुविधा चालू कर सकते हैं. FCM सूचना और बैकग्राउंड सूचना, दोनों के लिए डेटा एक्सपोर्ट करने की सुविधा देता है. डेटा एक्सपोर्ट करने की सुविधा, ऐप्लिकेशन लेवल पर डिफ़ॉल्ट रूप से बंद होती है. इसे प्रोग्राम के हिसाब से ऐप्लिकेशन इंस्टेंस लेवल पर चालू करने से, आपको असली उपयोगकर्ताओं से उनके मैसेज डिलीवरी डेटा का विश्लेषण करने की अनुमति मांगने का विकल्प मिलता है. हमारा सुझाव है कि आप ऐसा करें. दोनों को सेट करने पर, ऐप्लिकेशन इंस्टेंस लेवल की वैल्यू, ऐप्लिकेशन लेवल की वैल्यू को बदल देती है.

इन विकल्पों को चालू करने से पहले, आपको अपने प्रोजेक्ट के लिए FCM-BigQuery लिंक बनाना होगा. इसके बारे में BigQuery में डेटा एक्सपोर्ट करना लेख में बताया गया है.

सूचनाओं के लिए, डिलीवरी डेटा एक्सपोर्ट करने की सुविधा चालू करना

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

सूचना मिलने पर, यह कॉल करना ज़रूरी है:

Swift

// For alert notifications, call the API inside the service extension:
class NotificationService: UNNotificationServiceExtension {
  override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
    Messaging.serviceExtension().exportDeliveryMetrics(withMessageInfo:request.content.userInfo)
  }
}

Objective-C

// For alert notifications, call the API inside the service extension:
@implementation NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request
                   withContentHandler:(void (^)(UNNotificationContent *_Nonnull))contentHandler {
  [[FIRMessaging extensionHelper] exportDeliveryMetricsToBigQueryWithMessageInfo:request.content.userInfo];
}
@end

अगर एचटीटीपी v1 API का इस्तेमाल करके अनुरोध भेजे जा रहे हैं, तो पक्का करें कि आपने payload object में `mutable-content = 1` को सेट किया हो.

बैकग्राउंड में दिखने वाली सूचनाओं के लिए, डिलीवरी डेटा एक्सपोर्ट करने की सुविधा चालू करना

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

Swift

// For background notifications, call the API inside the
// UIApplicationDelegate or NSApplicationDelegate method:
func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
  Messaging.serviceExtension().exportDeliveryMetricsToBigQuery(withMessageInfo:userInfo)
}

Objective-C

// For background notifications, call the API inside the
// UIApplicationDelegate or NSApplicationDelegate method:
@implementation AppDelegate
- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)userInfo
          fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  [[FIRMessaging extensionHelper] exportDeliveryMetricsToBigQueryWithMessageInfo:userInfo];
}
@end

Android

Android डिवाइसों पर FCM SDK 20.1.0 या इसके बाद के वर्शन का इस्तेमाल किया जा सकता है. इन डिवाइसों पर, ऐप्लिकेशन के मैसेज डिलीवरी डेटा को एक्सपोर्ट करने की सुविधा चालू की जा सकती है. डेटा एक्सपोर्ट करने की सुविधा, ऐप्लिकेशन लेवल पर डिफ़ॉल्ट रूप से बंद होती है. इसे ऐप्लिकेशन इंस्टेंस लेवल पर प्रोग्राम के हिसाब से चालू करने पर, आपको असली उपयोगकर्ताओं से उनके मैसेज डिलीवरी डेटा का विश्लेषण करने की अनुमति मांगने का विकल्प मिलता है (सुझाया गया). दोनों को सेट करने पर, ऐप्लिकेशन इंस्टेंस लेवल की वैल्यू, ऐप्लिकेशन लेवल की वैल्यू को बदल देती है.

इन विकल्पों को चालू करने से पहले, आपको अपने प्रोजेक्ट के लिए FCM-BigQuery लिंक बनाना होगा. इसके बारे में BigQuery में डेटा एक्सपोर्ट करना लेख में बताया गया है.

ऐप्लिकेशन इंस्टेंस के लिए, डिलीवरी डेटा एक्सपोर्ट करने की सुविधा चालू करना

ज़्यादातर मामलों में, हमारा सुझाव है कि मैसेज डिलीवरी के डेटा को एक्सपोर्ट करने की सुविधा सिर्फ़ ऐप्लिकेशन इंस्टेंस लेवल पर चालू करें. साथ ही, इसे ऐप्लिकेशन लेवल पर बंद रखें.

FirebaseMessaging.getInstance().setDeliveryMetricsExportToBigQuery(true);

किसी ऐप्लिकेशन के लिए, डिलीवरी डेटा एक्सपोर्ट करने की सुविधा चालू करना

अगर आपको ऐप्लिकेशन लेवल पर एक्सपोर्ट करने की सुविधा चालू करनी है, तो पक्का करें कि आपने setDeliveryMetricsExportToBigQuery तरीके को नहीं कॉल किया हो. साथ ही, अपने ऐप्लिकेशन मेनिफ़ेस्ट में ऐप्लिकेशन ऑब्जेक्ट में यह प्रॉपर्टी जोड़ी हो:

<application>
  <meta-data android:name="delivery_metrics_exported_to_big_query_enabled"
      android:value="true" />
</application>

वेब

FCM SDK for Web 12.14.0 या इसके बाद के वर्शन की मदद से, डिलीवरी का डेटा एक्सपोर्ट किया जा सकता है. डेटा एक्सपोर्ट करने की सुविधा, ऐप्लिकेशन लेवल पर डिफ़ॉल्ट रूप से बंद होती है. इसे प्रोग्राम के हिसाब से ऐप्लिकेशन इंस्टेंस लेवल पर चालू करने से, आपको असली उपयोगकर्ताओं से उनके मैसेज डिलीवरी डेटा का विश्लेषण करने की अनुमति मांगने का विकल्प मिलता है. हमारा सुझाव है कि आप ऐसा करें. दोनों को सेट करने पर, ऐप्लिकेशन इंस्टेंस लेवल की वैल्यू, ऐप्लिकेशन लेवल की वैल्यू को बदल देती है. जब कोई असली उपयोगकर्ता, डेटा कलेक्शन की सहमति देता है या उसे अस्वीकार करता है, तो ऐप्लिकेशन को हर ऐप्लिकेशन इंस्टेंस के लिए, एक्सपेरिमेंटल enable या disable फ़्लैग सेट करना चाहिए. जैसा कि यहां दिखाया गया है:

// userConsent holds the decision of the user to give big query export consent.
const userConsent = ...;

const messaging = getMessagingInSw(app);

experimentalSetDeliveryMetricsExportedToBigQueryEnabled(messaging, userConsent);

BigQuery में किस तरह का डेटा एक्सपोर्ट किया जाता है?

ध्यान दें कि पुराने टोकन या ऐसे रजिस्ट्रेशन को टारगेट करने से, इनमें से कुछ आंकड़ों में बढ़ोतरी हो सकती है जो इस्तेमाल में नहीं हैं.

एक्सपोर्ट की गई टेबल का स्कीमा यह है:

_PARTITIONTIME टाइमस्टैंप इस स्यूडो कॉलम में, डेटा लोड होने के दिन की शुरुआत का टाइमस्टैंप (यूटीसी में) होता है. YYYYMMDD पार्टीशन के लिए, इस स्यूडो कॉलम में TIMESTAMP('YYYY-MM-DD') वैल्यू होती है.
event_timestamp टाइमस्टैंप सर्वर के ज़रिए रिकॉर्ड किया गया इवेंट का टाइमस्टैंप
project_number पूर्णांक प्रोजेक्ट नंबर से उस प्रोजेक्ट की पहचान होती है जिसने मैसेज भेजा है
message_id स्ट्रिंग मैसेज आईडी से किसी मैसेज की पहचान होती है. ऐप्लिकेशन आईडी और टाइमस्टैंप से जनरेट होने की वजह से, ऐसा हो सकता है कि मैसेज आईडी कुछ मामलों में दुनिया भर में यूनीक न हो.
instance_id स्ट्रिंग यह उस ऐप्लिकेशन का यूनीक आईडी होता है जिस पर मैसेज भेजा गया है (अगर उपलब्ध हो). यह इंस्टेंस आईडी या Firebase इंस्टॉलेशन आईडी हो सकता है.
message_type स्ट्रिंग यह मैसेज का टाइप है. यह सूचना वाला मैसेज या डेटा मैसेज हो सकता है. विषय का इस्तेमाल, किसी विषय या कैंपेन के लिए भेजे गए ओरिजनल मैसेज की पहचान करने के लिए किया जाता है. इसके बाद के मैसेज, सूचना वाले मैसेज या डेटा मैसेज होते हैं.
sdk_platform स्ट्रिंग मैसेज पाने वाले ऐप्लिकेशन का प्लैटफ़ॉर्म
app_name स्ट्रिंग Android ऐप्लिकेशन के लिए पैकेज का नाम या iOS ऐप्लिकेशन के लिए बंडल आईडी
collapse_key स्ट्रिंग कोलैप्स की मदद से, मैसेज के ऐसे ग्रुप की पहचान की जाती है जिन्हें छोटा किया जा सकता है. जब कोई डिवाइस कनेक्ट नहीं होता है, तो एक ही कोलैप्स कुंजी वाले सिर्फ़ आखिरी मैसेज को डिलीवरी के लिए कतार में रखा जाता है
प्राथमिकता पूर्णांक मैसेज की प्राथमिकता. 5 "सामान्य" प्राथमिकता है और 10 "ज़्यादा" प्राथमिकता है.
ttl पूर्णांक इस पैरामीटर से यह तय होता है कि अगर डिवाइस ऑफ़लाइन है, तो मैसेज को FCM स्टोरेज में कितने समय तक (सेकंड में) सेव रखा जाना चाहिए
topic स्ट्रिंग जिस विषय पर मैसेज भेजा गया है उसका नाम (लागू होने पर)
bulk_id पूर्णांक बल्क आईडी, मिलते-जुलते मैसेज के ग्रुप की पहचान करता है. जैसे, किसी विषय पर भेजे गए मैसेज
इवेंट स्ट्रिंग इवेंट का टाइप. इन वैल्यू का इस्तेमाल किया जा सकता है:
  • MESSAGE_ACCEPTED: इसका मतलब है कि FCM सर्वर को मैसेज मिल गया है और अनुरोध मान्य है;
  • MESSAGE_DELIVERED: मैसेज को डिवाइस पर, ऐप्लिकेशन के FCM SDK पर डिलीवर कर दिया गया है. डिफ़ॉल्ट रूप से, यह फ़ील्ड नहीं दिखता. इसे चालू करने के लिए, setDeliveryMetricsExportToBigQuery(boolean) में दिए गए निर्देशों का पालन करें.
  • MISSING_REGISTRATIONS: रजिस्ट्रेशन मौजूद न होने की वजह से अनुरोध अस्वीकार कर दिया गया;
  • UNAUTHORIZED_REGISTRATION: ईमेल को अस्वीकार कर दिया गया है, क्योंकि ईमेल भेजने वाले व्यक्ति के पास, रजिस्ट्रेशन के लिए ईमेल भेजने की अनुमति नहीं है;
  • MESSAGE_RECEIVED_INTERNAL_ERROR: मैसेज के अनुरोध को प्रोसेस करते समय कोई गड़बड़ी हुई है;
  • MISMATCH_SENDER_ID: मैसेज भेजने के अनुरोध को अस्वीकार कर दिया गया है. ऐसा इसलिए हुआ, क्योंकि मैसेज भेजने वाले आईडी और एंड-पॉइंट के लिए बताए गए आईडी में अंतर है;
  • QUOTA_EXCEEDED: कोटा पूरा न होने की वजह से, मैसेज भेजने का अनुरोध अस्वीकार कर दिया गया;
  • INVALID_REGISTRATION: अमान्य रजिस्ट्रेशन की वजह से, मैसेज भेजने का अनुरोध अस्वीकार कर दिया गया;
  • INVALID_PACKAGE_NAME: पैकेज का नाम अमान्य होने की वजह से, मैसेज भेजने का अनुरोध अस्वीकार कर दिया गया;
  • INVALID_APNS_CREDENTIAL: APNS सर्टिफ़िकेट अमान्य होने की वजह से, मैसेज भेजने का अनुरोध अस्वीकार कर दिया गया;
  • INVALID_PARAMETERS: अमान्य पैरामीटर की वजह से, मैसेज भेजने का अनुरोध अस्वीकार कर दिया गया;
  • PAYLOAD_TOO_LARGE: मैसेज भेजने का अनुरोध इसलिए अस्वीकार कर दिया गया, क्योंकि पेलोड तय सीमा से ज़्यादा था;
  • AUTHENTICATION_ERROR: पुष्टि करने से जुड़ी गड़बड़ी की वजह से, मैसेज भेजने का अनुरोध अस्वीकार कर दिया गया. मैसेज भेजने के लिए इस्तेमाल की गई एपीआई कुंजी की जांच करें;
  • INVALID_TTL: टीटीएल अमान्य होने की वजह से, मैसेज भेजने का अनुरोध अस्वीकार कर दिया गया.
analytics_label स्ट्रिंग HTTP v1 API की मदद से, मैसेज भेजते समय Analytics लेबल सेट किया जा सकता है. इससे मैसेज को Analytics के लिए मार्क किया जा सकता है

एक्सपोर्ट किए गए डेटा का इस्तेमाल किस तरह किया जा सकता है?

यहां दिए गए सेक्शन में, उन क्वेरी के उदाहरण दिए गए हैं जिन्हें BigQuery में, एक्सपोर्ट किए गए FCM डेटा के ख़िलाफ़ चलाया जा सकता है.

ऐप्लिकेशन के हिसाब से भेजे गए मैसेज की संख्या

SELECT app_name, COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED'
  AND message_id != ''
GROUP BY 1;

मैसेज से टारगेट किए गए यूनीक ऐप्लिकेशन इंस्टेंस की संख्या

SELECT COUNT(DISTINCT instance_id)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED';

भेजी गई सूचनाओं की संख्या

SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED'
  AND message_type = 'DISPLAY_NOTIFICATION';

भेजे गए डेटा मैसेज की संख्या

SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED'
  AND message_type = 'DATA_MESSAGE';

किसी विषय या कैंपेन को भेजे गए मैसेज की संख्या गिनना

SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED'
  AND bulk_id = your bulk id AND message_id != '';

किसी विषय पर भेजे गए मैसेज के लिए इवेंट ट्रैक करने के लिए, इस क्वेरी में बदलाव करें. इसके लिए, AND message_id != '' को AND message_id = <your message id>; से बदलें.

किसी विषय या कैंपेन के लिए, फ़ैनआउट की अवधि का हिसाब लगाना

फ़ैनआउट शुरू होने का समय वह होता है, जब ओरिजनल अनुरोध मिलता है. वहीं, खत्म होने का समय वह होता है, जब किसी एक इंस्टेंस को टारगेट करने वाला आखिरी मैसेज बनाया जाता है.

SELECT
  TIMESTAMP_DIFF(
    end_timestamp, start_timestamp, MILLISECOND
  ) AS fanout_duration_ms,
  end_timestamp,
  start_timestamp
FROM (
    SELECT MAX(event_timestamp) AS end_timestamp
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
      AND event = 'MESSAGE_ACCEPTED'
      AND bulk_id = your bulk id
  ) sent
  CROSS JOIN (
    SELECT event_timestamp AS start_timestamp
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
      AND event = 'MESSAGE_ACCEPTED'
      AND bulk_id = your bulk id
      AND message_type = 'TOPIC'
  ) initial_message;

डिलीवर किए गए मैसेज की संख्या का प्रतिशत

SELECT
  messages_sent,
  messages_delivered,
  messages_delivered / messages_sent * 100 AS percent_delivered
FROM (
    SELECT COUNT(DISTINCT CONCAT(message_id, instance_id)) AS messages_sent
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
      AND event = 'MESSAGE_ACCEPTED'
  ) sent
  CROSS JOIN (
    SELECT COUNT(DISTINCT CONCAT(message_id, instance_id)) AS messages_delivered
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
      AND (event = 'MESSAGE_DELIVERED'
      AND message_id
      IN (
        SELECT message_id FROM `project ID.firebase_messaging.data`
        WHERE
          _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
          AND event = 'MESSAGE_ACCEPTED'
        GROUP BY 1
      )
  ) delivered;

किसी मैसेज आईडी और इंस्टेंस आईडी के लिए सभी इवेंट ट्रैक करना

SELECT *
FROM `project ID.firebase_messaging.data`
WHERE
    _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
    AND message_id = 'your message id'
    AND instance_id = 'your instance id'
ORDER BY event_timestamp;

किसी मैसेज आईडी और इंस्टेंस आईडी के लिए, कंप्यूट लेटेन्सी का पता लगाना

SELECT
  TIMESTAMP_DIFF(
    MAX(delivered_time), MIN(accepted_time), MILLISECOND
  ) AS latency_ms
FROM (
    SELECT event_timestamp AS accepted_time
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
      AND message_id = 'your message id'
      AND instance_id = 'your instance id'
      AND event = 'MESSAGE_ACCEPTED'
  ) sent
  CROSS JOIN (
    SELECT event_timestamp AS delivered_time
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND
      message_id = 'your message id' AND instance_id = 'your instance id'
      AND (event = 'MESSAGE_DELIVERED'
  ) delivered;