18 दिस॰ 2025·8 मिनट पढ़ने में

iOS और Android पुश नोटिफिकेशन्स के लिए APNs बनाम FCM

iOS और Android के लिए APNs बनाम FCM तुलना: टोकन लाइफसाइकल, पेलोड सीमा, डिलीवरी अपेक्षाएँ, और गायब पुश ठीक करने के लिए व्यावहारिक चेकलिस्ट।

iOS और Android पुश नोटिफिकेशन्स के लिए APNs बनाम FCM

आप क्या तुलना कर रहे हैं (और क्यों यह मायने रखता है)

APNs (Apple Push Notification service) और FCM (Firebase Cloud Messaging) वे डिलीवरी पाइप हैं जो आपके सर्वर से फोन तक संदेश भेजते हैं। वे यह तय नहीं करते कि आपका ऐप संदेश के साथ क्या करेगा, लेकिन वे इस पर बड़ा प्रभाव डालते हैं कि संदेश पहुँचेगा या नहीं, कितनी तेज़ी से पहुँचेगा, और उसका स्वरूप कैसा होना चाहिए।

जब लोग कहते हैं कि पुश नोटिफिकेशन “Android पर काम कर रहा है पर iOS पर नहीं” (या उल्टा), तो यह शायद किसी एकल बग की वजह नहीं होता। iOS और Android बैकग्राउंड काम, पावर‑सेविंग, अनुमतियाँ, और संदेश प्राथमिकता को अलग तरह से हैंडल करते हैं। वही संदेश देरी हो सकता है, नए संदेश से बदल सकता है, आवाज़ के बिना दिख सकता है, या कभी भी प्रदर्शित नहीं होगा अगर ऐप इसे प्रोसेस करने के लिए जाग नहीं पाता।

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

यह पुश प्रोवाइडर UI, मार्केटिंग रणनीति, या पूरा एनालिटिक्स पाइपलाइन बनाने को कवर नहीं करती। यहाँ लक्ष्य विश्वसनीयता और तेज़ डीबगिंग है।

कुछ शर्तें जो आगे उपयोग होंगी:

  • टोकन: एक डिवाइस‑विशिष्ट एड्रेस जिसे आप भेजते हैं, APNs या FCM द्वारा जारी किया जाता है।
  • टॉपिक: एक ग्रुप एड्रेस (मुख्य रूप से FCM में) जहाँ कई डिवाइस सबस्क्राइब करते हैं।
  • चैनल: एक Android नोटिफ़िकेशन कैटेगरी जो साउंड, इम्पॉर्टेंस और व्यवहार को नियंत्रित करती है।
  • कोलैप्स कुंजी: पुराने पेंडिंग संदेशों को नए से बदलने का एक तरीका।
  • TTL (time to live): कितनी देर तक संदेश डिलीवरी के लिए इंतज़ार कर सकता है इससे पहले कि यह एक्सपायर हो जाए।

इन मूल बातों को सही करना "सिंपल पुश" के iOS और Android पर अलग व्यवहार का अनुमान लगाने में घंटों बचाता है।

उच्च स्तर पर APNs और FCM कैसे काम करते हैं

APNs और FCM दोनों आपके सर्वर और उपयोगकर्ता के फोन के बीच मध्यस्थ हैं। आपका ऐप इंटरनेट पर सीधे डिवाइस तक भरोसेमंद रूप से पुश नहीं भेज सकता, इसलिए यह यह काम Apple (APNs) या Google (FCM) को सौंपता है, जिनके पास पहले से डिवाइस के साथ ट्रस्टेड कनेक्शन मौजूद हैं।

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

सरल शब्दों में APNs

iOS पर, ऐप रिमोट नोटिफ़िकेशन्स के लिए रजिस्टर करता है और (आम तौर पर) उपयोगकर्ता से अनुमति माँगता है। फिर Apple एक डिवाइस टोकन प्रदान करता है। आपका बैकएंड (अक्सर "प्रोवाइडर" कहा जाता है) APNs को उस टोकन और आपके पेलोड सहित एक पुश रिक्वेस्ट भेजता है। APNs तय करता है कि यह डिलीवर कर सकता है या नहीं और नोटिफ़िकेशन को डिवाइस तक फॉरवर्ड करता है।

आपका बैकएंड APNs को ऑथेंटिकेट करता है, आम तौर पर टोकन‑आधारित ऑथ (साइनिंग की) का उपयोग करके। पुराने सेटअप सर्टिफिकेट्स का उपयोग करते हैं।

सरल शब्दों में FCM

Android पर, ऐप इंस्टेंस FCM के साथ रजिस्टर होता है और एक रजिस्ट्रेशन टोकन प्राप्त करता है। आपका बैकएंड FCM को संदेश भेजता है, और FCM इसे सही डिवाइस तक रूट करता है। ऐप की स्थिति और संदेश प्रकार पर निर्भर करते हुए, FCM स्वचालित रूप से नोटिफ़िकेशन दिखा सकता है या ऐप को डेटा हँड करने के लिए संदेश डिलीवर कर सकता है।

आपका बैकएंड FCM को सर्वर क्रेडेंशियल्स (API key या सर्विस अकाउंट) का उपयोग करके ऑथेंटिकेट करता है।

आप क्या नियंत्रित करते हैं: ऐप कोड, जब आप अनुमति मांगते हैं, टोकन स्टोरेज, बैकएंड लॉजिक, और भेजा गया पेलोड। Apple और Google क्या नियंत्रित करते हैं: डिलीवरी नेटवर्क, रीचेबिलिटी, थ्रॉटलिंग नियम, और कई "लास्ट‑माइल" स्थितियाँ जैसे पावर‑सेविंग और सिस्टम नीतियाँ।

टोकन लाइफसाइकल: कैसे टोकन जारी, रिफ्रेश और रद्द होते हैं

APNs vs FCM में दिन‑प्रतिदिन का सबसे बड़ा फर्क यह है कि टोकन "एक बार सेट और हमेशा के लिए" नहीं होते। उन्हें ऐसे एड्रेस समझें जो बिना चेतावनी के बदल सकते हैं।

iOS पर, APNs डिवाइस टोकन डिवाइस, आपका ऐप, और आपके Apple डेवलपर सेटअप से जुड़ा होता है। यह ऐप रीइंस्टॉल, डिवाइस रेस्टोर, कुछ OS अपडेट्स, या डेवलपमेंट के दौरान पुश एन्वायरनमेंट (sandbox vs production) बदलने के बाद बदल सकता है।

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

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

  • उपयोगकर्ता या अकाउंट आईडी (यदि लागू हो)
  • ऐप बंडल/पैकेज और एन्वायरनमेंट
  • प्लेटफ़ॉर्म (iOS/Android)
  • टोकन मान और last‑seen टाइमस्टैम्प
  • ऑप्ट‑इन स्थिति (अनुमति दी/इनकार की)

डिलीट्स भी मायने रखते हैं। आम तौर पर आप यह नहीं जानते कि टोकन मृत है जब तक कि आपको डिलीवरी एरर से खबर न मिले, न कि किसी साफ़ "अनइंस्टॉल" सिग्नल से। अगर APNs एक त्रुटि लौटाता है जैसे Unregistered (अक्सर 410 स्टेटस के साथ), या FCM कहता है NotRegistered/Unregistered, तो उस टोकन को तुरंत हटा दें ताकि आप अनंतकाल तक रीट्राई न करते रहें।

एक आसान जगह जहाँ निजी अपडेट लीक हो सकते हैं: एक ग्राहक लॉग आउट करता है और दूसरे ने उसी फोन पर लॉग इन कर लिया। अगर आप लॉगआउट पर टोकन क्लियर या रिमैप नहीं करते, तो आप गलत व्यक्ति को नोटिफ़िकेशन भेज सकते हैं, भले ही डिलीवरी "काम" कर रही हो।

पेलोड सीमाएँ और संदेश संरचना के अंतर

APNs और FCM का सबसे बड़ा व्यावहारिक अंतर यह है कि आप संदेश में कितना फिट कर सकते हैं और फोन उसे कब और कैसे सुलझाता है।

अधिकांश टीमें कुछ फ़ील्ड पर भरोसा करती हैं:

  • टाइटल और बॉडी टेक्स्ट
  • बैज काउंट (iOS)
  • साउंड (डिफ़ॉल्ट या कस्टम)
  • कस्टम की‑वैल्यू डेटा (उदाहरण के लिए, order_id, status)

साइज सीमाएँ: पुश को छोटा रखें

दोनों सेवाओं के पेलोड साइज लिमिट्स हैं, और यह सीमा आपके कस्टम डेटा को भी शामिल करती है। जब आप कैप तक पहुँचते हैं, तो डिलीवरी फेल हो सकती है या संदेश वैसा व्यवहार नहीं करेगा जैसा आप चाहते हैं।

एक भरोसेमंद पैटर्न यह है कि एक छोटा नोटिफ़िकेशन प्लस एक आईडी भेजें, फिर विवरण आपकी बैकएंड से फ़ेच कराएँ:

उदाहरण: पूरा ऑर्डर समरी भेजने के बजाय { "type": "order_update", "order_id": "123" } भेजें और ऐप को नवीनतम स्टेटस लाने के लिए आपकी API कॉल कराएँ।

डेटा‑ओनली बनाम नोटिफ़िकेशन व्यवहार

Android पर, एक FCM संदेश जिसमें "notification" पेलोड होता है, वह आमतौर पर सिस्टम द्वारा तब प्रदर्शित किया जाता है जब ऐप बैकग्राउंड में होता है। एक डेटा‑ओनली संदेश आपके ऐप को हँड किया जाता है, लेकिन यह बैकग्राउंड लिमिट्स और बैटरी सेटिंग्स द्वारा देरी या ब्लॉक हो सकता है।

iOS पर, अलर्ट (टाइटल/बॉडी) सरल हैं, पर बैकग्राउंड अपडेट्स ज़्यादा सख्त हैं। बैकग्राउंड पुश यह गारंटी नहीं देते कि आपका कोड तुरंत चलेगा। इसे रिफ्रेश का संकेत समझें, असली‑समय जॉब ट्रिगर नहीं।

अगर आपको विश्वसनीयता चाहिए, तो पेलोड को न्यूनतम रखें, एक स्थिर पहचानकर्ता शामिल करें, और ऐप को इस तरह डिज़ाइन करें कि वह ओपन या रिज़्यूम होने पर स्टेट को reconcile करे।

डिलीवरी अपेक्षाएँ और क्या किसी नोटिफ़िकेशन को रोक सकता है

पुश को एक प्रॉम्प्ट की तरह उपयोग करें
आईडी के साथ लीन पुश भेजें, फिर ओपन पर अपने API से विवरण लोड करें।
API बनाएं

APNs और FCM दोनों के साथ, डिलीवरी best‑effort है। प्रोवाइडर आपके संदेश को डिलीवर करने की कोशिश करेगा, लेकिन यह गारंटी नहीं देता कि डिवाइस इसे दिखाएगा।

रीचेबिलिटी पहली सीमा है। आप एक नोटिफ़िकेशन भेजते हैं जिसमें TTL या एक्सपायरी होती है। अगर डिवाइस उस विंडो के बाद ऑनलाइन आए तो पुश ड्रॉप हो जाएगा। अगर TTL बहुत लंबा है, तो उपयोगकर्ता बाद में पुराना अलर्ट देख सकता है, जो कि एक बग जैसा लगेगा।

प्राथमिकता समय पर असर डालती है, पर यह मुफ्त उन्नयन नहीं है। हाई प्रायोरिटी समय‑सेंसिटिव संदेशों को तेज़ी से पहुंचाने में मदद कर सकती है, खासकर जब डिवाइस सोया हुआ हो। इसका अधिक उपयोग थ्रॉटलिंग, बैटरी ड्रेन, या OS के द्वारा आपके ऐप को noisy मानने का कारण बन सकता है।

दोनों सिस्टम कोलैप्स का समर्थन करते हैं ताकि नया संदेश पुराने पेंडिंग को रिप्लेस कर दे बजाय स्टैक होने के। APNs कोलैप्स पहचानकर्ता (collapse identifier) का उपयोग करता है, और FCM कोलैप्स की (collapse key) का। अगर आप order_status जैसे कुछ पर collapse करते हैं, तो उपयोगकर्ता केवल नवीनतम स्टेटस देख सकता है, हर चरण नहीं।

यहाँ तक कि जब प्रोवाइडर सफलतापूर्वक डिलीवर कर देता है, तब भी फोन उपयोगकर्ता को दिखाने से रोक सकता है:

  • Do Not Disturb या Focus मोड अलर्ट्स को साइलेंस या छिपा सकते हैं
  • ऐप नोटिफ़िकेशन सेटिंग्स डिसेबल या क्वाइट डिलीवरी पर सेट हो सकती हैं
  • Android नोटिफ़िकेशन चैनल्स किसी विशिष्ट कैटेगरी के लिए बंद किए जा सकते हैं
  • बैकग्राउंड प्रतिबंध या बैटरी सेवर डिलीवरी में देरी कर सकते हैं
  • OS कई समान अलर्ट्स को दबा सकता है अगर आपका ऐप बहुत सारे समान अलर्ट पोस्ट करता है

पुश को एक अविश्वसनीय ट्रांसपोर्ट समझें: महत्वपूर्ण स्टेट को अपने बैकएंड में रखें, और ऐप को तब भी करंट स्टेट रिफ्रेश करने के लिए डिज़ाइन करें जब वह खोला जाए, भले ही नोटिफ़िकेशन कभी न दिखे।

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

कई "डिलीवरी समस्याएँ" असल में अनुमति और सेटिंग्स की समस्याएँ होती हैं।

iOS पर, पहला परमिशन प्रॉम्प्ट मायने रखता है। अगर उपयोगकर्ता "Don’t Allow" टैप करता है, तो नोटिफ़िकेशन्स तब तक नहीं दिखेंगी जब तक वे Settings में इसे बदल न दें। अनुमति देने के बाद भी वे Lock Screen, Notification Center, बैनर्स, साउंड या बैज को बंद कर सकते हैं। Focus मोड और Scheduled Summary भी अलर्ट्स को छिपा या देर कर सकते हैं।

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

बैकग्राउंड प्रतिबंध भी अपेक्षाओं को तोड़ सकते हैं। iOS पर Low Power Mode और Android पर बैटरी ऑप्टिमाइज़ेशन बैकग्राउंड काम को देर कर सकते हैं, बैकग्राउंड डेटा रोक सकते हैं, या डेटा‑ओनली संदेश को प्रोसेस करने से रोक सकते हैं।

क्या हो रहा है यह पुष्टि करने के लिए, केवल सर्वर‑सेंड लॉग्स पर निर्भर न रहें—डिवाइस पर जो दिखाई देता है उसे लॉग करें:

  • इन‑ऐप लॉग्स: “permission granted,” “token registered,” “notification received,” “notification displayed”
  • OS संकेतक: नोटिफ़िकेशन सेटिंग्स स्थिति (enabled/muted/channel importance) और बैटरी मोड
  • पुश कॉलबैक्स: whether आपका ऐप फोरग्राउंड/बैकग्राउंड में मैसेज प्राप्त कर रहा है

यहाँ तक कि अगर आपका बैकएंड नो‑कोड टूल में बना है, क्लाइंट‑साइड लॉगिंग अभी भी वही चीज़ है जो “संदेश नहीं मिला” और “मिला पर दबा दिया गया” को अलग करती है।

स्टेप‑बाय‑स्टेप: गायब नोटिफ़िकेशन्स का ट्रबलशूट कैसे करें

पुश भेजने के ऑडिट लॉग जोड़ें
प्रोवाइडर प्रतिक्रियाएँ और ऑडिट ट्रेल रखें ताकि “भेजा गया” और “दिखाया गया” गड़बड़ न हों।
लॉग सेट करें

जब कोई पुश गायब हो, तो इसे एक चेन की तरह ट्रीट करें: टोकन, प्रोवाइडर, पेलोड, और ऐप व्यवहार। लक्षण iOS और Android पर समान दिख सकते हैं, इसलिए उन्हीं कुछ बिंदुओं की उसी क्रम में जाँच करें।

  • पुष्टि करें कि आप एक करंट टोकन पर भेज रहे हैं। अपने सर्वर पर स्टोर किए गए टोकन की तुलना उस टोकन से करें जो ऐप ने हाल ही में रिपोर्ट किया। हर टोकन के लिए जब आख़िरी बार मिला उसे लॉग करें।
  • भेजने से पहले पेलोड वैलिडेट करें। इसे प्लेटफ़ॉर्म लिमिट्स के अंदर रखें, आवश्यक फ़ील्ड्स का उपयोग करें, और malformed JSON से बचें। अगर आप डेटा‑ओनली संदेश भेजते हैं, तो पुष्टि करें कि ऐप उन्हें हैंडल करने के लिए बिल्ट है।
  • प्रोवाइडर क्रेडेंशियल्स और एन्वायरनमेंट चेक करें। APNs के लिए, की/सर्टिफिकेट, टीम, बंडल ID, और क्या आप sandbox vs production लक्षित कर रहे हैं यह कन्फ़र्म करें। FCM के लिए, सही प्रोजेक्ट क्रेडेंशियल्स कन्फ़र्म करें।

फिर संकुचित करें कि यह संदेश सामग्री की समस्या है या डिवाइस/ऐप व्यवहार की:

  • एक न्यूनतम टेस्ट नोटिफ़िकेशन भेजें। एक छोटा टाइटल/बॉडी पेलोड यह पुष्टि करने में मदद करता है कि ट्रांसपोर्ट काम कर रहा है।
  • ऐप‑साइड हैंडलर्स और फोरग्राउंड व्यवहार वेरिफाई करें। कई "गुम" पुश रिसीव तो हो जाते हैं पर दिखाए नहीं जाते। कुछ ऐप फोरग्राउंड में बैनर्स दबा देते हैं।
  • एक‑एक कर के एक वैरिएबल बदलें। एक दूसरा डिवाइस आज़माएँ, अलग OS वर्ज़न, Wi‑Fi बनाम सेलुलर, और एक अलग यूज़र अकाउंट। अगर केवल एक अकाउंट फेल कर रहा है, तो अक्सर यह स्टेल टोकन या सर्वर‑साइड टार्गेटिंग की ओर इशारा करता है।

एक व्यावहारिक पैटर्न: अगर iOS उपयोगकर्ता मिस की शिकायत कर रहे हैं पर Android ठीक है, तो iOS पर एक न्यूनतम अलर्ट भेजकर शुरू करें। अगर वह काम करता है, तो पेलोड संरचना और ऐप हैंडलिंग पर ध्यान दें। अगर वह काम नहीं करता, तो टोकन और APNs क्रेडेंशियल्स/एन्वायरनमेंट पर ध्यान दें।

सामान्य गलतियाँ जो साइलेंट फेलियर्स पैदा करती हैं

जहाँ आपकी टीम को चाहिए वहाँ डिप्लॉय करें
जब आपको पूर्ण नियंत्रण चाहिए तो क्लाउड प्रोवाइडर्स पर तैनात करें या स्रोत कोड एक्सपोर्ट करें।
ऐप तैनात करें

ज्यादातर पुश समस्याएँ आउटेज नहीं होतीं। वे छोटे‑छोटे मिसमैच होते हैं कि आपका ऐप क्या उम्मीद करता है और APNs या FCM क्या स्वीकार करेंगे, या फोन क्या अनुमति देता है।

सबसे आम गलती वह है कि आप ऐसे टोकन पर भेज रहे हैं जो अब वैध नहीं है। रीइंस्टॉल, रिस्टोर या रिफ्रेश के बाद टोकन बदल जाते हैं। अगर आपका सर्वर पुराने मान का उपयोग करता रहता है, तो पुश कहीं नहीं पहुँचेंगे।

एक और है पुश डिलीवरी को गारंटी समझना। Best‑effort डिलीवरी का मतलब है कि लेट या गायब संदेश सामान्य हैं जब डिवाइस ऑफलाइन हो या पावर‑सेविंग नियम लागू हों। महत्वपूर्ण घटनाओं (ऑर्डर अपडेट, सुरक्षा अलर्ट) के लिए आपको एक इन‑ऐप फॉलबैक चाहिए जैसे कि ओपन पर नवीनतम स्टेटस फ़ेच करना।

मिस होने के सामान्य कारण:

  • रीइंस्टॉल/रिफ्रेश के बाद स्टेल iOS या Android टोकन
  • पुश पेलोड सीमा पार होना (बहुत अधिक कस्टम डेटा, बड़े इमेजेज, लंबे स्ट्रिंग्स)
  • साइलेंट अपडेट के लिए बैकग्राउंड डिलीवरी पर निर्भर रहना, और फिर OS बैकग्राउंड लिमिट द्वारा थ्रॉटल हो जाना
  • iOS एन्वायरनमेंट्स (डेव vs प्रोड) को मिलाना, जिससे टोकन और APNs एंडपॉइंट मैच नहीं करते
  • उपयोगकर्ता ऑप्ट‑आउट, Focus/Do Not Disturb, डिसेबल्ड नोटिफ़िकेशन चैनल्स (Android), या ऐप‑लेवल नोटिफ़िकेशन परमिशन की अनदेखी

उदाहरण: एक रिटेल ऐप "order shipped" अलर्ट भेजता है जिसमें ट्रैकिंग हिस्ट्री का बड़ा JSON ब्लॉब होता है। भेजने का कॉल ठीक दिखता है, पर पेलोड अस्वीकार या ट्रंकेट हो जाता है, और उपयोगकर्ता कुछ भी नहीं देखता। पुश को छोटा रखें और विवरण को API कॉल के पीछे रखें।

जब आप APNs या FCM को दोष दें उससे पहले त्वरित चेकलिस्ट

प्रोवाइडर को समस्या मानने से पहले एक सैनीटी चेक चलाएँ:

  • पुष्टि करें कि टोकन उपयोगकर्ता और डिवाइस के लिए सही है। यह मौजूद होना चाहिए, हाल ही में अपडेट हुआ होना चाहिए, और सही से सत्र के साथ मैप किया गया होना चाहिए।
  • वर्तमान में प्रोवाइडर क्रेडेंशियल्स वैध हैं यह वेरिफाई करें। APNs कीज़/सर्ट्स और FCM क्रेडेंशियल्स सही ऐप/प्रोजेक्ट से मेल खाते हों।
  • पेलोड का आकार और आकार Validate करें। लिमिट्स के भीतर रहें और सही फ़ील्ड्स का उपयोग करें।
  • TTL, प्राथमिकता, और कोलैप्स जानबूझ कर सेट करें। कम TTL से फोन के ऑनलाइन होने से पहले मैसेज एक्सपायर हो सकता है। कम प्राथमिकता डिले कर सकती है। कोलैप्स पहले के मैसेज को बदल सकती है।
  • “सर्वर ने स्वीकार किया” और “डिवाइस ने दिखाया” को अलग रखें। सर्वर लॉग्स (रिक्वेस्ट/रिस्पॉन्स/मैसेज ID) की तुलना क्लाइंट लॉग्स (उपयोग किए गए टोकन, हैंडलर कॉल हुए) से करें।

फिर एक तेज़ डिवाइस चेक करें: ऐप के लिए नोटिफ़िकेशन्स अलाउड हैं, सही चैनल/कैटेगरी कॉन्फ़िगर है (Android चैनल्स अक्सर गोटचा होते हैं), Focus/Do Not Disturb मोड, और बैकग्राउंड प्रतिबंध।

उदाहरण: गायब ऑर्डर अपडेट नोटिफ़िकेशन का डायग्नोज़िस

टोकन-सुरक्षित बैकएंड बनाएं
एक बैकएंड बनाएं जो टोकन को अपसर्ट करे, "last seen" ट्रैक करे, और डुप्लिकेट लक्ष्यों से बचे।
बनाना शुरू करें

एक सपोर्ट एजेंट "Send order update" (#1842) टैप करता है। बैकएंड लॉग्स में "notification sent" दिखता है, पर कस्टमर अपने iPhone या Android फोन पर कुछ भी नहीं देखता।

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

पहले बैकएंड चेक्स

एक ट्रेस होने वाली सिंगल भेजने की कोशिश ढूँढें (एक ऑर्डर अपडेट को एक पुश रिक्वेस्ट देना चाहिए)। फिर सत्यापित करें:

  • उपयोग किया गया टोकन उस उपयोगकर्ता और डिवाइस के लिए सबसे हाल का टोकन है जो सर्वर पर स्टोर है।
  • पुश प्रोवाइडर रिस्पॉन्स सफलता है, और आपने कोई एरर कोड सेव किया है।
  • पेलोड प्लेटफ़ॉर्म नियमों के अनुरूप है (साइज़ लिमिट, आवश्यक फ़ील्ड, वैध JSON)।
  • ऑथ वैध है (APNs की/सर्ट और टीम/बंडल IDs, या FCM क्रेडेंशियल्स)।
  • आपने सही iOS एन्वायरनमेंट (sandbox vs production) को टार्गेट किया है।

अगर आपके लॉग्स में किसी तरह की रिजेक्शन दिखे जैसे “unregistered/invalid token”, तो यह टोकन लाइफसाइकल की समस्या है। अगर प्रोवाइडर मैसेज स्वीकार करता है पर कुछ नहीं पहुँचता, तो पेलोड टाइप और OS व्यवहार पर ध्यान दें।

फोन पर चेक्स

अब वेरिफाई करें कि फोन अलर्ट दिखाने की अनुमति देता है:

  • ऐप के लिए नोटिफ़िकेशन्स सक्षम हैं (और Lock Screen/Banners के लिए अनुमति है)।
  • Focus/Do Not Disturb या नोटिफ़िकेशन समरी इसे छिपा नहीं रहे।
  • बैटरी सेवर मोड बैकग्राउंड काम को प्रतिबंधित नहीं कर रहा (Android पर अधिक सामान्य)।
  • ऐप की स्थिति आपके संदेश प्रकार से मेल खाती है (फोरग्राउंड हैंडलिंग अलर्ट्स को खा सकती है)।

एक सामान्य परिणाम यह है: टोकन ठीक है, पर संदेश डेटा‑ओनली है (Android) या iOS पर बैकग्राउंड हैंडलिंग के लिए सही सेटअप नहीं है, इसलिए OS कभी अलर्ट प्रदर्शित ही नहीं करता। समाधान यह है कि आप जो दिखाना चाहते हैं उसके लिए सही प्रकार का पेलोड भेजें (दिखने वाला अलर्ट बनाम बैकग्राउंड अपडेट) और टोकन अपडेट्स व प्रोवाइडर रिस्पॉन्सेस के साफ़ लॉग रखें।

अगले कदम: अपने प्रॉडक्ट में पुश को अधिक विश्वसनीय बनाएं

पुश नोटिफ़िकेशन्स सरल लगते हैं जब तक कि वे एक कोर फीचर नहीं बन जाते। विश्वसनीयता उन हिस्सों से आती है जिन्हें आप नियंत्रित करते हैं: टोकन हाइजीन, पेलोड अनुशासन, और एक फॉलबैक पाथ।

मिसिस के लिए प्लान करें। पुश "अब देखो" क्षणों के लिए शानदार है, पर यह महत्वपूर्ण घटनाओं का एकमात्र रास्ता नहीं होना चाहिए। एक इन‑ऐप इनबॉक्स उपयोगकर्ताओं को बाद में पकड़े रहने में मदद करती है, और ईमेल या SMS उच्च‑मूल्य कार्रवाइयों (पासवर्ड रिसेट, पेमेंट इश्यू) को कवर कर सकते हैं।

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

अपनी टीम के लिए एक छोटा रनबुक लिखें ताकि डीबगिंग लगातार रहे: ऑप्ट‑इन स्टेट, टोकन फ़्रेशनेस, प्रोवाइडर रिस्पॉन्स कोड्स, पेलोड साइज़/शेप, और एन्वायरनमेंट/क्रेडेंशियल्स।

अगर आप AppMaster (appmaster.io) के साथ बना रहे हैं, तो यह सुविधाजनक हो सकता है कि टोकन स्टोरेज, ऑडिट लॉग्स, और पुश‑ट्रिगरिंग बिज़नेस लॉजिक एक ही बैकएंड में रखें, जबकि नेटिव iOS और Android ऐप्स APNs और FCM को सही तरीके से हैंडल करते रहें।

सामान्य प्रश्न

What’s the simplest way to explain APNs vs FCM?

APNs Apple की iOS पुश नोटिफिकेशन सर्विस है, और FCM Google की डिलीवरी सर्विस है (जो iOS को APNs के माध्यम से भी लक्षित कर सकती है)। आपका ऐप तय करता है कि संदेश के साथ क्या करना है, लेकिन ये सेवाएँ यह तय करती हैं कि आप कैसे ऑथेंटिकेट करेंगे, पेलोड कैसे फ़ॉर्मेट होगा, और आप किस तरह की डिलीवरी उम्मीद कर सकते हैं।

Do device tokens stay the same forever?

टोकन को बदलने योग्य एड्रेस के रूप में समझें। उन्हें प्लेटफ़ॉर्म और एन्वायरनमेंट डिटेल के साथ स्टोर करें, जब भी ऐप नया मान रिपोर्ट करे तब अपडेट करें, और जब प्रोवाइडर कहे कि वे अमान्य हैं तब हटाएँ। व्यावहारिक नियम यह है कि टोकन को "upsert" करें और "last seen" टाइमस्टैम्प रखें ताकि आप जल्दी से स्टेल रिकॉर्ड पहचान सकें।

What usually causes an iOS or Android push token to change?

iOS पर, टोकन आमतौर पर ऐप को रीइंस्टॉल करने, डिवाइस रेस्टोर करने, कुछ OS अपडेट्स के बाद, या डेवलपमेंट के दौरान sandbox और production के बीच स्विच करने पर बदल सकते हैं। Android पर, FCM टोकन ऐप रीइंस्टॉल, ऐप डेटा क्लियर करने, डिवाइस रेस्टोर, या Google द्वारा टोकन रोटेशन के बाद रिफ्रेश हो सकते हैं। आपके ऐप को रिफ्रेश इवेंट्स सुनने चाहिए और नया टोकन तुरंत आपके बैकएंड को भेजना चाहिए।

How should I structure a push payload to avoid problems?

पुश पेलोड छोटा रखें और इसे एक प्रॉम्प्ट की तरह समझें। यदि आपको विजिबल अलर्ट चाहिए तो छोटा टाइटल/बॉडी भेजें और एक स्थिर पहचानकर्ता जैसे order_id शामिल करें, फिर ऐप से पूरा विवरण आपके API से लोड कराएँ। इससे पेलोड लिमिट्स से बचा जा सकता है, एज‑केस कम होंगे, और प्लेटफ़ॉर्म के बीच व्यवहार अधिक संगत रहेगा।

What’s the difference between “notification” and “data-only” messages?

नोटिफ़िकेशन पेलोड उपयोगकर्ता को दिखाने के लिए होता है, जबकि डेटा‑ओनली पेलोड ऐप द्वारा प्रोसेस करने के लिए होता है। Android पर, डेटा‑ओनली संदेश बैकग्राउंड लिमिट्स और बैटरी सेटिंग्स के कारण देरी या ब्लॉक हो सकते हैं, इसलिए वे तत्काल कार्य के लिए भरोसेमंद ट्रिगर नहीं होते। iOS पर भी, बैकग्राउंड पुश आपके कोड को तुरंत चलाने की गारंटी नहीं देते; इन्हें रिफ्रेश का संकेत समझें, वास्तविक‑समय जॉब ट्रिगर नहीं।

Are push notifications guaranteed to be delivered and shown?

नहीं — डिलीवरी best‑effort होती है। यहां तक कि अगर APNs या FCM ने आपकी रिक्वेस्ट स्वीकार कर ली, डिवाइस ऑफ़लाइन हो सकती है, संदेश TTL के कारण एक्सपायर हो सकता है, OS डिलीवरी को थ्रॉटल कर सकता है, या उपयोगकर्ता सेटिंग्स अलर्ट्स को दबा सकती हैं। अपने ऐप को इस तरह डिज़ाइन करें कि महत्वपूर्ण स्टेट तब भी सही रहे जब उपयोगकर्ता ऐप खोले, भले ही नोटिफ़िकेशन कभी न दिखे।

What’s the fastest way to debug a missing notification?

सबसे पहले “भेजा गया” और “दिखाया गया” अलग करें। टोकन वर्तमान है या नहीं इसकी पुष्टि करें, एक न्यूनतम टाइटल/बॉडी टेस्ट पेलोड भेजें, और यह सुनिश्चित करें कि आप सही APNs/FCM क्रेडेंशियल्स और (iOS के लिए) सही एन्वायरनमेंट उपयोग कर रहे हैं। अगर प्रोवाइडर ने संदेश स्वीकार कर लिया है, तो फोन सेटिंग्स चेक करें: Focus/Do Not Disturb, ऐप नोटिफ़िकेशन अनुमतियाँ, और Android नोटिफ़िकेशन चैनल्स—क्योंकि संदेश रिसीव तो हुआ होगा पर तय किया जा सकता है कि उसे डिस्प्ले न किया जाए।

Why do notifications work on Android but not on iOS (or the opposite)?

iOS पर अक्सर समस्या अनुमति न देने, Focus मोड्स, या गलत APNs एन्वायरनमेंट (sandbox vs production) को लक्षित करने से आती है। Android पर सामान्य बाधाएँ हैं: नए OS वर्ज़न पर रनटाइम नोटिफ़िकेशन अनुमति, म्यूट/लो‑इम्पॉर्टेंस नोटिफ़िकेशन चैनल, और आक्रामक बैटरी ऑप्टिमाइज़ेशन जो बैकग्राउंड प्रोसेसिंग में देरी करते हैं। वही बैकएंड भेजना Android पर ठीक दिख सकता है जबकि डिवाइस कुछ भी दिखाने से रोक रहा होता है।

How do TTL and “collapse key” affect what users see?

TTL तय करता है कि प्रोवाइडर कितने समय तक डिवाइस को ऑफलाइन होने पर कोशिश करे, और collapse सेटिंग्स यह तय करती हैं कि नया संदेश पुराने को रिप्लेस करे या नहीं। छोटा TTL यह कर सकता है कि अगर फोन कुछ समय के लिए ऑफलाइन रहा तो नोटिफ़िकेशन गायब हो जाए, और collapse की वजह से केवल नवीनतम अपडेट ही दिखे। इन मानों को उस UX के अनुसार सेट करें जो आप चाहते हैं, डिफ़ॉल्ट्स पर भरोसा मत करें जो आपने कभी नहीं बदले।

How can AppMaster help me build a reliable push notification setup?

टोकन स्टोरेज, टार्गेटिंग नियम, और भेजने के लॉग्स को एक जगह रखें ताकि आप हर पुश प्रयास को एंड‑टू‑एंड ट्रेस कर सकें। AppMaster (appmaster.io) टोकन टेबल्स, ऑडिट लॉगिंग, और पुश‑ट्रिगरिंग बिज़नेस लॉजिक को केंद्रीकृत करने में मदद कर सकता है, जबकि आपके नेटिव iOS और Android ऐप APNs और FCM को सही तरीके से हैंडल करते हैं। कुंजी यह है कि टोकन अपडेट्स, प्रोवाइडर प्रतिक्रियाएँ, और क्लाइंट‑साइड रिसीट लॉग करें ताकि आप पता लगा सकें कि फेलियर सर्वर, प्रोवाइडर या डिवाइस व्यवहार में से कहाँ है।

शुरू करना आसान
कुछ बनाएं अद्भुत

फ्री प्लान के साथ ऐपमास्टर के साथ प्रयोग करें।
जब आप तैयार होंगे तब आप उचित सदस्यता चुन सकते हैं।

शुरू हो जाओ