FCM रजिस्ट्रेशन मैनेज करने के सबसे सही तरीके

अगर प्रोग्राम के ज़रिए, मैसेज भेजने के अनुरोध बनाने के लिए, FCM एपीआई का इस्तेमाल किया जाता है, तो हो सकता है कि समय के साथ-साथ, इस्तेमाल न किए जा रहे डिवाइसों को मैसेज भेजकर, आपके रिसॉर्स बर्बाद हो रहे हों. ऐसा इसलिए, क्योंकि इन डिवाइसों के रजिस्ट्रेशन की समयसीमा खत्म हो चुकी होती है. इस स्थिति का असर, मैसेज डिलीवरी के डेटा पर पड़ सकता है. यह डेटा Firebase कंसोल में रिपोर्ट किया गया है या BigQuery पर एक्सपोर्ट किया गया है. इससे डिलीवरी रेट में अचानक (लेकिन असल में नहीं) गिरावट दिख सकती है. इस गाइड में, कुछ ऐसे मेज़रमेंट के बारे में बताया गया है जिनकी मदद से, मैसेज को सही ऑडियंस तक पहुंचाने और डिलीवरी की सही रिपोर्टिंग पक्का की जा सकती है.

समयसीमा खत्म हो चुके और पुराने रजिस्ट्रेशन

समयसीमा खत्म हो चुके रजिस्ट्रेशन, इस्तेमाल न किए जा रहे उन डिवाइसों से जुड़े होते हैं जो एक महीने से ज़्यादा समय से कनेक्ट नहीं हुए हैं FCM. समय बीतने के साथ-साथ, इस बात की संभावना कम होती जाती है कि डिवाइस कभी दोबारा कनेक्ट हो पाएगा.FCM समयसीमा खत्म हो चुके इन रजिस्ट्रेशन के लिए, मैसेज भेजने और विषय के हिसाब से मैसेज भेजने की सुविधा के तहत भेजे गए मैसेज की डिलीवरी कभी नहीं हो पाएगी.

रजिस्ट्रेशन की समयसीमा खत्म होने की कई वजहें हो सकती हैं. उदाहरण के लिए, हो सकता है कि रजिस्ट्रेशन से जुड़ा डिवाइस खो गया हो, खराब हो गया हो या उसे स्टोरेज में रख दिया गया हो और उसके बारे में भूल गए हों.

Android के लिए, जब कोई रजिस्ट्रेशन 270 दिनों तक इस्तेमाल नहीं किया जाता, तो FCM उसे एक्सपायर मान लेता है और उसे हटा देता है. रजिस्ट्रेशन की समयसीमा खत्म होने के बाद, FCM उसे अमान्य के तौर पर मार्क कर देता है और उस पर मैसेज भेजने के अनुरोध को अस्वीकार कर देता है. ध्यान दें कि Firebase इंस्टॉलेशन आईडी (एफ़आईडी) को FCM नहीं, बल्कि the Firebase Installations service (FIS) मैनेज करती है. ऐसा बहुत कम होता है कि किसी डिवाइस के रजिस्ट्रेशन को हटा दिए जाने के बाद, वह डिवाइस दोबारा कनेक्ट हो और उस पर ऐप्लिकेशन खोला जाए. ऐसे में, क्लाइंट ऐप्लिकेशन, FIS से मिले एफ़आईडी का इस्तेमाल करके, FCM के साथ फिर से रजिस्टर हो जाता है. ध्यान दें कि एफ़आईडी बदल सकता है; एफ़आईडी कब दोबारा जारी किए जाते हैं, इस बारे में ज़्यादा जानने के लिए, Firebase इंस्टॉलेशन मैनेज करना लेख पढ़ें.

iOS जैसे अन्य प्लैटफ़ॉर्म के लिए, FCM पुश सेवा (जैसे, APNs) पर निर्भर करता है. इस सेवा में, 270 दिनों तक इस्तेमाल न किए जाने पर, रजिस्ट्रेशन की समयसीमा खत्म होने की सुविधा नहीं होती. हमारा सुझाव है कि आप रजिस्ट्रेशन को सक्रिय रूप से अप-टू-डेट रखें और पुरानी जानकारी वाले रजिस्ट्रेशन हटाएं.

सबसे सही बुनियादी तरीके

आपको उन सभी ऐप्लिकेशन में कुछ बुनियादी तरीके अपनाने चाहिए जो प्रोग्राम के ज़रिए, मैसेज भेजने के अनुरोध बनाने के लिए, FCM एपीआई का इस्तेमाल करते हैं. सबसे सही बुनियादी तरीके ये हैं:

  • FCM से FCM Firebase इंस्टॉलेशन आईडी (एफ़आईडी) वापस पाएं और उन्हें अपने ऐप्लिकेशन सर्वर पर सेव करें. सर्वर की एक अहम भूमिका यह है कि वह हर क्लाइंट के रजिस्टर किए गए एफ़आईडी को ट्रैक करे और ऐक्टिव एफ़आईडी की अपडेट की गई सूची बनाए रखे. हमारा सुझाव है कि अपने डेटाबेस में रजिस्ट्रेशन का टाइमस्टैंप जोड़ें और हर बार रजिस्ट्रेशन अपलोड होने पर, उसे अपडेट करें.
  • रजिस्ट्रेशन को अप-टू-डेट रखें और समयसीमा खत्म हो चुके रजिस्ट्रेशन हटाएं. FCM अब जिन रजिस्ट्रेशन को FCMमान्य नहीं मानता उन्हें हटाने के अलावा, आपको उन अन्य संकेतों पर भी नज़र रखनी चाहिए जिनसे पता चलता है कि रजिस्ट्रेशन की समयसीमा खत्म हो चुकी है. साथ ही, उन्हें पहले से ही हटा देना चाहिए. इस गाइड में, ऐसा करने के कुछ विकल्पों के बारे में बताया गया है.

Firebase इंस्टॉलेशन आईडी वापस पाना और सेव करना

आपका ऐप्लिकेशन पहली बार शुरू होने पर, FCM SDK, ऐप्लिकेशन इंस्टेंस को FCM के साथ रजिस्टर करता है और Firebase इंस्टॉलेशन आईडी (एफ़आईडी) दिखाता है. यह वह आइडेंटिफ़ायर है जिसे आपको एपीआई से, टारगेट किए गए मैसेज भेजने के अनुरोधों में शामिल करना होगा या विषय की सदस्यता के लिए इस्तेमाल करना होगा.

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

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

  • (सुझाया गया) ऑटो-इनिशियलाइज़ेशन की सुविधा चालू होने पर: SDK, रजिस्ट्रेशन को अपने-आप अप-टू-डेट रखता है और बदलावों की निगरानी करता है. The onRegistered() कॉलबैक को ऐप्लिकेशन शुरू होने के दौरान, रूटीन सिंक के साथ-साथ, एफ़आईडी में बदलाव होने पर, नियमित तौर पर लागू किया जाता है. एफ़आईडी को अपने सर्वर पर अपलोड करने और मौजूदा टाइमस्टैंप को सेव करने के लिए, बस इस कॉलबैक को लागू करें.
  • ऑटो-इनिशियलाइज़ेशन की सुविधा बंद होने पर: onRegistered() कॉलबैक, शुरू होने पर अपने-आप लागू नहीं होगा. रजिस्ट्रेशन को ट्रैक करने और उन्हें अप-टू-डेट रखने के लिए, ऐप्लिकेशन शुरू होने पर register() को कॉल करें. उदाहरण के लिए, Android पर, मुख्य गतिविधि के onCreate() में. कॉल के सफल होने पर, एफ़आईडी का इस्तेमाल करके, FCM रजिस्ट्रेशन की प्रोसेस शुरू हो जाती है और यह आपके onRegistered() कॉलबैक को डिलीवर हो जाता है. इससे आपका ऐप्लिकेशन, एफ़आईडी को अपलोड कर पाता है और आपके सर्वर पर टाइमस्टैंप को अपडेट कर पाता है.

उदाहरण: Cloud Firestore में एफ़आईडी और टाइमस्टैंप सेव करना

उदाहरण के लिए, Cloud Firestore का इस्तेमाल करके, एफ़आईडी को fcmRegistrations नाम के कलेक्शन में सेव किया जा सकता है. कलेक्शन में मौजूद हर दस्तावेज़ का आईडी, उपयोगकर्ता आईडी से मेल खाता है. साथ ही, दस्तावेज़ में मौजूदा एफ़आईडी और उसका आखिरी अपडेट किया गया टाइमस्टैंप सेव होता है. इस Kotlin उदाहरण में दिखाए गए तरीके से, set फ़ंक्शन का इस्तेमाल करें:

private fun sendRegistrationToServer(installationId: String?) {
    // If you're running your own server, call API to send registration details and today's date for the user

    // Example shown uses Firestore
    // Add FID and timestamp to Firestore for this user
    val deviceFid = hashMapOf(
        "installationId" to installationId,
        "timestamp" to FieldValue.serverTimestamp(),
    )
    // Get user ID from Firebase Auth or your own server
    Firebase.firestore.collection("fcmRegistrations").document("myuserid")
        .set(deviceFid)
}

जब भी Firebase इंस्टॉलेशन आईडी रजिस्टर या अपडेट किया जाता है, तो onRegistered() कॉलबैक लागू होता है. एफ़आईडी को अपलोड करने और टाइमस्टैंप को अपडेट करने के लिए, आपको इस कॉलबैक को लागू करना चाहिए:

override fun onRegistered(installationId: String) {
    Log.d(TAG, "Registered installation ID: $installationId")

    // Send the Firebase Installation ID (FID) to your app server. Your app
    // server should save the FID and update the timestamp upon receipt.
    sendRegistrationToServer(installationId)
}

जिन इंस्टेंस के लिए ऑटो-इनिशियलाइज़ेशन की सुविधा बंद है उनके लिए, रजिस्ट्रेशन फ़्लो और एफ़आईडी डिलीवरी को ट्रिगर करने के लिए, ऐप्लिकेशन शुरू होने पर (जैसे, onCreate() में) register() को कॉल करें:onRegistered()

// Trigger manual registration if auto-initialization is turned off.
FirebaseMessaging.getInstance().register()
    .addOnCompleteListener(this) { task ->
        if (task.isSuccessful) {
            // The registration callback onRegistered() will be invoked with the current FID.
        } else {
            Log.w(TAG, "Failed to register with Firebase Cloud Messaging", task.exception)
        }
    }

रजिस्ट्रेशन को अप-टू-डेट रखना और समयसीमा खत्म हो चुके रजिस्ट्रेशन हटाना

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

आपके इस्तेमाल के उदाहरण के आधार पर, एक महीना बहुत कम या बहुत ज़्यादा हो सकता है. इसलिए, यह तय करना आपके ऊपर है कि आपके लिए कौनसे मानदंड काम करते हैं.

FCM बैकएंड से मिले अमान्य जवाबों का पता लगाना

पक्का करें कि FCM से मिले अमान्य जवाबों का पता लगाया जाए और आपके सिस्टम से उन सभी रजिस्ट्रेशन को मिटाकर जवाब दिया जाए जो अमान्य हैं या जिनकी समयसीमा खत्म हो चुकी है. HTTP v1 API की मदद से, इन गड़बड़ी के मैसेज से यह पता चल सकता है कि आपके मैसेज भेजने के अनुरोध में, अमान्य या समयसीमा खत्म हो चुके रजिस्ट्रेशन को टारगेट किया गया है:

  • UNREGISTERED (HTTP 404)
  • INVALID_ARGUMENT (HTTP 400)

अगर आपको पक्का है कि मैसेज पेलोड मान्य है और आपको टारगेट किए गए रजिस्ट्रेशन के लिए इनमें से कोई भी जवाब मिलता है, तो इस रजिस्ट्रेशन का रिकॉर्ड मिटाया जा सकता है. ऐसा इसलिए, क्योंकि यह कभी भी मान्य नहीं होगा. उदाहरण के लिए, Cloud Firestore से अमान्य रजिस्ट्रेशन मिटाने के लिए, यहां दिया गया फ़ंक्शन डिप्लॉय और रन किया जा सकता है:

        // Firebase Installation ID comes from the client FCM SDKs
        const firebaseInstallationId = 'YOUR_FIREBASE_INSTALLATION_ID';

        const message = {
            data: {
                // Information you want to send inside of notification
            },
            fid: firebaseInstallationId
        };

        // Send message to device with provided Firebase Installation ID
        getMessaging().send(message)
        .then((response) => {
            // Response is a message ID string.
        })
        .catch((error) => {
            // Delete registration for user if error code is UNREGISTERED or INVALID_ARGUMENT.
            if (error.errorCode == "messaging/registration-token-not-registered") {
                // If you're running your own server, call API to delete the registration for the user
                // Example shown uses Firestore
                // Get user ID from Firebase Auth or your own server
                Firebase.firestore.collection("fcmRegistrations").document(user.uid).delete()
            }
        });

FCM अगर Android डिवाइस के लिए किसी रजिस्ट्रेशन की समयसीमा, 270 दिनों तक इस्तेमाल न किए जाने के बाद खत्म हो गई है या किसी क्लाइंट ने साफ़ तौर पर अनरजिस्टर किया है, तो अमान्य जवाब दिखाता है. अगर आपको अपनी परिभाषाओं के हिसाब से, समयसीमा खत्म होने की स्थिति को ज़्यादा सटीक तरीके से ट्रैक करना है, तो समयसीमा खत्म हो चुके रजिस्ट्रेशन को पहले से ही हटाया जा सकता है.

रजिस्ट्रेशन को नियमित तौर पर अपडेट करना

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

एफ़आईडी एपीआई का इस्तेमाल करने वाले क्लाइंट ऐप्लिकेशन के लिए, आपको रजिस्ट्रेशन वापस पाने या उन्हें रीफ़्रेश करने के लिए, अपने क्लाइंट ऐप्लिकेशन में समय-समय पर बैकग्राउंड जॉब शेड्यूल करने की ज़रूरत नहीं है. ऑटो-इनिशियलाइज़ेशन की सुविधा चालू होने पर, SDK रीफ़्रेश की सुविधा को अपने-आप मैनेज करता है. साथ ही, ऐप्लिकेशन शुरू होने के दौरान, रूटीन सिंक के साथ, आपके onRegistered() कॉलबैक को सही मौजूदा एफ़आईडी नियमित तौर पर डिलीवर करता है.

अपने सर्वर को अपडेट रखने के लिए, Firebase इंस्टॉलेशन आईडी वापस पाना और सेव करना में बताई गई, स्टार्टअप अपलोड करने की रणनीतियां लागू करें:

  • ऑटो-इनिशियलाइज़ेशन की सुविधा चालू होने पर: SDK, यह अपने-आप पक्का करता है कि ऐप्लिकेशन शुरू होने के दौरान, रूटीन सिंक के साथ, आपके सर्वर को मौजूदा एफ़आईडी भेजा जाए.
  • ऑटो-इनिशियलाइज़ेशन की सुविधा बंद होने या उपलब्ध न होने पर: रजिस्ट्रेशन सीक्वेंस को फ़ोर्स करने और आपके onRegistered() कॉलबैक को एफ़आईडी डिलीवरी को ट्रिगर करने के लिए, ऐप्लिकेशन शुरू होने पर register() को कॉल करें. उदाहरण के लिए, Android पर, मुख्य गतिविधि के onCreate()में.

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

रजिस्ट्रेशन टोकन के पुराने एपीआई

अगर पुराने रजिस्ट्रेशन टोकन का इस्तेमाल किया जा रहा है, तो क्लाइंट SDK, रूटीन सिंक के साथ, रीफ़्रेश को अपने-आप मैनेज नहीं करता. इसलिए, हमारा सुझाव है कि अपने सर्वर पर, सभी रजिस्ट्रेशन टोकन को समय-समय पर वापस पाएं और अपडेट करें. इसके लिए, आपको ये काम करने होंगे:

  • अपने क्लाइंट ऐप्लिकेशन में, ऐप्लिकेशन लॉजिक जोड़ें, ताकि सही एपीआई कॉल (जैसे, token(completion): Apple प्लैटफ़ॉर्म के लिए या getToken() Android के लिए) का इस्तेमाल करके, मौजूदा टोकन वापस पाया जा सके. इसके बाद, मौजूदा टोकन को अपने ऐप्लिकेशन सर्वर पर सेव करने के लिए भेजें. साथ ही, उसका टाइमस्टैंप भी भेजें. यह एक महीने में एक बार होने वाली जॉब हो सकती है, जिसे सभी क्लाइंट या टोकन के लिए कॉन्फ़िगर किया जा सकता है.
  • टोकन का टाइमस्टैंप नियमित अंतराल पर अपडेट करने के लिए, सर्वर लॉजिक जोड़ें. भले ही, टोकन में बदलाव हुआ हो या नहीं.

WorkManager का इस्तेमाल करके, पुराने टोकन अपडेट करने के लिए, Android लॉजिक का उदाहरण देखने के लिए, Firebase ब्लॉग पर Cloud Messaging टोकन मैनेज करना लेख पढ़ें.

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

समयसीमा खत्म हो चुके रजिस्ट्रेशन हटाना

किसी डिवाइस को मैसेज भेजने से पहले, पक्का करें कि डिवाइस के रजिस्ट्रेशन का टाइमस्टैंप, समयसीमा खत्म होने की विंडो की अवधि के अंदर हो. उदाहरण के लिए, यह पक्का करने के लिए कि टाइमस्टैंप, समयसीमा खत्म होने की तय विंडो की अवधि के अंदर हो, हर दिन जांच करने के लिए आप लागू कर सकते हैं. जैसे, const EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 30; इसके बाद, समयसीमा खत्म हो चुके रजिस्ट्रेशन हटाएं:Cloud Functions for Firebase

exports.pruneRegistrations = functions.pubsub.schedule('every 24 hours').onRun(async (context) => {
  // Get all documents where the timestamp exceeds is not within the past month
  const staleRegistrationsResult = await admin.firestore().collection('fcmRegistrations')
      .where("timestamp", "<", Date.now() - EXPIRATION_TIME)
      .get();
  // Delete devices with stale registrations
  staleRegistrationsResult.forEach(function(doc) { doc.ref.delete(); });
});
exports.pruneTokens = functions.pubsub.schedule('every 24 hours').onRun(async (context) => { // Get all documents where the timestamp exceeds is not within the past month const staleTokensResult = await admin.firestore().collection('fcmTokens') .where("timestamp", "<", Date.now() - EXPIRATION_TIME) .get(); // Delete devices with stale tokens staleTokensResult.forEach(function(doc) { doc.ref.delete(); }); });

समयसीमा खत्म हो चुके रजिस्ट्रेशन को विषयों से सदस्यता खत्म करना

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

  1. Firebase इंस्टॉलेशन आईडी (एफ़आईडी) में बदलाव होने पर, आपके ऐप्लिकेशन को विषयों की फिर से सदस्यता लेनी चाहिए. इससे, ऐप्लिकेशन के दोबारा ऐक्टिव होने पर, सदस्यताएं अपने-आप दिखने लगती हैं.
  2. अगर कोई ऐप्लिकेशन इंस्टेंस एक महीने तक इस्तेमाल नहीं किया जाता है (या समयसीमा खत्म होने की आपकी तय विंडो), तो आपको Firebase Admin SDK का इस्तेमाल करके, उसकी सदस्यता खत्म कर देनी चाहिए. ऐसा करने से, FCM बैकएंड से, Firebase इंस्टॉलेशन आईडी से विषय की मैपिंग मिट जाएगी.FCM

इन दो चरणों का फ़ायदा यह है कि आपके मैसेज, तेज़ी से भेजे जा सकेंगे, क्योंकि समयसीमा खत्म हो चुके रजिस्ट्रेशन कम होंगे. साथ ही, समयसीमा खत्म हो चुके आपके ऐप्लिकेशन इंस्टेंस, दोबारा ऐक्टिव होने पर, अपने-आप सदस्यता ले लेंगे.

डिलीवरी की सफलता को मेज़र करना

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

किसी ऐप्लिकेशन इंस्टेंस को मैसेज टारगेट करने से पहले, इन बातों पर ध्यान दें:

  • क्या Google Analytics, BigQuery में कैप्चर किया गया डेटा या अन्य ट्रैकिंग सिग्नल से पता चलता है कि रजिस्ट्रेशन ऐक्टिव है?
  • क्या पिछले डिलीवरी के अनुरोध, समय-समय पर लगातार फ़ेल हुए हैं?
  • क्या पिछले एक महीने में, आपके सर्वर पर Firebase इंस्टॉलेशन आईडी अपडेट किया गया है?
  • Android डिवाइसों के लिए, क्या FCM Data API मैसेज डिलीवरी में फ़ेल होने की दर ज़्यादा रिपोर्ट करता है? droppedDeviceInactive

डिलीवरी के बारे में ज़्यादा जानने के लिए, मैसेज डिलीवरी को समझना लेख पढ़ें.