अगर प्रोग्राम के हिसाब से अनुरोध भेजने के लिए, FCM एपीआई का इस्तेमाल किया जाता है, तो पाते हैं कि समय के साथ, निष्क्रिय को संदेश भेज कर आप संसाधनों को बर्बाद कर रहे हैं पुराने रजिस्ट्रेशन टोकन वाले डिवाइस. यह स्थिति मैसेज पर असर डाल सकती है Firebase कंसोल में रिपोर्ट किया जाने वाला डिलीवरी डेटा या BigQuery में एक्सपोर्ट किया गया डेटा, विज्ञापन डिलीवरी की दरों में बहुत ज़्यादा (लेकिन असल में अमान्य) गिरावट के तौर पर दिखाना. यह इस गाइड में उन उपायों के बारे में बताया गया है जिनकी मदद से मैसेज का असरदार तरीके से इस्तेमाल किया जा सकता है लक्ष्यीकरण और मान्य वितरण रिपोर्टिंग.
पुराने और खत्म हो चुके रजिस्ट्रेशन टोकन
पुराने रजिस्ट्रेशन टोकन, उन डिवाइसों से जुड़े टोकन होते हैं जो इस्तेमाल में नहीं हैं एक महीने से ज़्यादा समय से FCM से कनेक्ट नहीं हुआ है. समय बीतने के साथ-साथ, यह कम होता जाता है और इस डिवाइस के FCM से फिर से कनेक्ट होने की संभावना कम हो जाएगी. मैसेज करें इस पुराने टोकन के लिए, भेजे गए और विषय के फ़ैनआउट की संभावना बहुत कम है डिलीवर हो गया.
किसी टोकन के पुराना होने की कई वजहें हो सकती हैं. उदाहरण के लिए, डिवाइस इससे जुड़ा टोकन खो सकता है, खत्म हो सकता है या स्टोरेज में रखा जा सकता है और भूलना.
अगर पुराने टोकन 270 दिनों तक इस्तेमाल नहीं किए जाते हैं, तो FCM उन्हें मानेगा समयसीमा खत्म हो चुके टोकन. टोकन की समयसीमा खत्म होने के बाद, FCM उसे अमान्य के तौर पर मार्क कर देता है और उसे अस्वीकार कर देता है. हालांकि, FCM, ऐप्लिकेशन के लिए एक नया टोकन जारी करता है बहुत कम मामलों में जब डिवाइस फिर से कनेक्ट होता है और ऐप्लिकेशन खोला जाता है.
सबसे सही बुनियादी तरीके
कुछ ऐसे बुनियादी तरीके हैं जिनका आपको अपने उन ऐप्लिकेशन में पालन करना चाहिए जिनमें प्रोग्राम के हिसाब से, ईमेल भेजने के अनुरोधों को बनाने के लिए FCM API. मुख्य सबसे अच्छा यहां दिए गए तरीके अपनाएं:
- FCM से रजिस्ट्रेशन टोकन वापस पाएं और उन्हें अपने यहां सेव करें सर्वर. हर क्लाइंट की परफ़ॉर्मेंस और टोकन और सक्रिय टोकन की अपडेट की गई सूची बनाए रखें. हमारा सुझाव है कि आप: आपके कोड और सर्वर में टोकन टाइमस्टैंप लागू करना और अपडेट करना नियमित अंतरालों पर इस टाइमस्टैंप को देखें.
- टोकन को अप-टू-डेट रखें और पुराने टोकन हटाएं. इसके अलावा ऐसे टोकन हटाए जा रहे हैं जिन्हें FCM अब मान्य नहीं मानता. ताकि अन्य संकेतों पर नज़र रखी जा सके कि टोकन पुराने हो गए हैं. साथ ही, उन्हें हटा दें सकता है. इस गाइड में, इस लक्ष्य को हासिल करने के कुछ विकल्पों के बारे में बताया गया है.
रजिस्ट्रेशन टोकन वापस पाएं और सेव करें
आपके ऐप्लिकेशन के शुरुआती चालू होने पर, FCM SDK टूल एक रजिस्ट्रेशन जनरेट करता है क्लाइंट ऐप्लिकेशन इंस्टेंस के लिए टोकन. इस टोकन को आपको शामिल करना होगा एपीआई से टारगेट करके, भेजने के अनुरोध भेजें या टारगेटिंग (विज्ञापन के लिए सही दर्शक चुनना) के लिए विषय की सदस्यताओं में जोड़ें विषय.
हमारा सुझाव है कि आपका ऐप्लिकेशन, शुरुआती शुरुआत में इस टोकन को फिर से हासिल करे और इसे टाइमस्टैंप के साथ अपने ऐप्लिकेशन सर्वर पर दिखाता है. यह टाइमस्टैंप लागू करता है, क्योंकि यह आपको FCM SDK टूल.
इसके अलावा, टोकन को सर्वर पर सेव करना और टाइमस्टैंप अपडेट करना ज़रूरी है इसमें बदलाव होने पर, जैसे कि:
- ऐप्लिकेशन को नए डिवाइस पर वापस लाया गया
- जब उपयोगकर्ता ऐप्लिकेशन को अनइंस्टॉल या फिर से इंस्टॉल करता है
- उपयोगकर्ता, ऐप्लिकेशन का डेटा मिटाता है
- ऐप्लिकेशन FCM की मौजूदा अवधि खत्म होने के बाद फिर से चालू हो जाता है टोकन
उदाहरण: Cloud Firestore में स्टोर टोकन और टाइमस्टैंप
उदाहरण के लिए, किसी कलेक्शन में टोकन सेव करने के लिए, Cloud Firestore का इस्तेमाल किया जा सकता है
fcmTokens
नाम का इस्तेमाल करें. कलेक्शन में मौजूद हर दस्तावेज़ आईडी
यूज़र आईडी होता है और दस्तावेज़ में मौजूदा रजिस्ट्रेशन टोकन सेव होता है और
पिछली बार अपडेट किया गया टाइमस्टैंप. set
फ़ंक्शन का इस्तेमाल करें, जैसा कि Kotlin के इस उदाहरण में दिखाया गया है:
/**
* Persist token to third-party servers.
*
* Modify this method to associate the user's FCM registration token with any server-side account
* maintained by your application.
*
* @param token The new token.
*/
private fun sendTokenToServer(token: String?) {
// If you're running your own server, call API to send token and today's date for the user
// Example shown below with Firestore
// Add token and timestamp to Firestore for this user
val deviceToken = hashMapOf(
"token" to token,
"timestamp" to FieldValue.serverTimestamp(),
)
// Get user ID from Firebase Auth or your own server
Firebase.firestore.collection("fcmTokens").document("myuserid")
.set(deviceToken)
}
जब भी कोई टोकन वापस पाया जाता है, तो उसे कॉल करके Cloud Firestore में सेव किया जाता है
sendTokenToServer
:
/**
* Called if the FCM registration token is updated. This may occur if the security of
* the previous token had been compromised. Note that this is called when the
* FCM registration token is initially generated so this is where you would retrieve the token.
*/
override fun onNewToken(token: String) {
Log.d(TAG, "Refreshed token: $token")
// If you want to send messages to this application instance or
// manage this apps subscriptions on the server side, send the
// FCM registration token to your app server.
sendTokenToServer(token)
}
var token = Firebase.messaging.token.await()
// Check whether the retrieved token matches the one on your server for this user's device
val preferences = this.getPreferences(Context.MODE_PRIVATE)
val tokenStored = preferences.getString("deviceToken", "")
lifecycleScope.launch {
if (tokenStored == "" || tokenStored != token)
{
// If you have your own server, call API to send the above token and Date() for this user's device
// Example shown below with Firestore
// Add token and timestamp to Firestore for this user
val deviceToken = hashMapOf(
"token" to token,
"timestamp" to FieldValue.serverTimestamp(),
)
// Get user ID from Firebase Auth or your own server
Firebase.firestore.collection("fcmTokens").document("myuserid")
.set(deviceToken).await()
}
}
टोकन को अप-टू-डेट रखें और पुराने टोकन हटाएं
यह तय करना हमेशा आसान नहीं होता कि टोकन नया है या पुराना. यहां की यात्रा पर हूं सभी मामलों को कवर किया जाता है, तो टोकन के बारे में विचार करते समय आपको एक थ्रेशोल्ड अपनाना चाहिए पुराना. अगर FCM का ऐप्लिकेशन, किसी टोकन को पुराना मानता है, तो वह डिफ़ॉल्ट रूप से उसे पुराना मानता है इंस्टेंस पिछले महीने से कनेक्ट नहीं हुआ है. एक महीने से ज़्यादा पुराना कोई भी टोकन इस्तेमाल किया जा सकता है अगर आपका डिवाइस इनऐक्टिव है; अगर कोई चालू डिवाइस, अन्य तरीके से इस टोकन.
आपके इस्तेमाल के उदाहरण के आधार पर, एक महीना बहुत छोटा या बहुत लंबा हो सकता है. इसलिए, ताकि आपके लिए सही मानदंड तय किए जा सकें.
FCM बैकएंड से अमान्य टोकन रिस्पॉन्स का पता लगाएं
पक्का करें कि FCM से मिले अमान्य टोकन रिस्पॉन्स का पता लगाया जाए. इसके बाद, इस तारीख तक जवाब दें अमान्य माने जाने वाले किसी भी रजिस्ट्रेशन टोकन को अपने सिस्टम से मिटाना या उनकी समयसीमा खत्म हो चुकी हो. HTTP v1 API का इस्तेमाल करने पर, गड़बड़ी के ये मैसेज यह बता सकते हैं कि भेजने के आपके अनुरोध में टारगेट किए गए अमान्य या समय-सीमा खत्म हो चुके टोकन:
UNREGISTERED
(एचटीटीपी 404)INVALID_ARGUMENT
(एचटीटीपी 400)
अगर आपको यकीन है कि मैसेज पेलोड मान्य है और आपको दोनों में से कोई एक टारगेट किए टोकन के लिए ये रिस्पॉन्स हैं, तो इस क्योंकि यह फिर से कभी मान्य नहीं होगा. उदाहरण के लिए, अमान्य टोकन मिटाने के लिए Cloud Firestore से, आप नीचे दिए गए जैसे फ़ंक्शन को डिप्लॉय और चला सकते हैं:
// Registration token comes from the client FCM SDKs
const registrationToken = 'YOUR_REGISTRATION_TOKEN';
const message = {
data: {
// Information you want to send inside of notification
},
token: registrationToken
};
// Send message to device with provided registration token
getMessaging().send(message)
.then((response) => {
// Response is a message ID string.
})
.catch((error) => {
// Delete token for user if error code is UNREGISTERED or INVALID_ARGUMENT.
if (errorCode == "messaging/registration-token-not-registered") {
// If you're running your own server, call API to delete the
token for the user
// Example shown below with Firestore
// Get user ID from Firebase Auth or your own server
Firebase.firestore.collection("fcmTokens").document(user.uid).delete()
}
});
टोकन की समयसीमा खत्म होने पर ही, FCM अमान्य टोकन रिस्पॉन्स दिखाएगा अगर क्लाइंट ने 270 दिनों के बाद अपना रजिस्ट्रेशन साफ़ तौर पर रद्द कर दिया है. अगर आपको और सटीक रूप से अपनी परिभाषाओं के अनुसार पुरानी बातें ट्रैक कर सकते हैं, तो आप अपने-आप पुराने रजिस्ट्रेशन टोकन हटाएं.
टोकन को समय-समय पर अपडेट करें
हमारा सुझाव है कि आप समय-समय पर सभी रजिस्ट्रेशन टोकन को वापस पाएं और अपडेट करें आपके सर्वर पर. इसके लिए ज़रूरी है कि आप:
- मौजूदा टोकन को वापस पाने के लिए, अपने क्लाइंट ऐप्लिकेशन में ऐप्लिकेशन लॉजिक जोड़ें
सही एपीआई कॉल करना, जैसे कि
token(completion):
या Apple प्लैटफ़ॉर्म के लिएgetToken()
और फिर स्टोरेज के लिए अपने ऐप्लिकेशन सर्वर पर मौजूदा टोकन भेजें (टाइमस्टैंप के साथ). यह सभी को शामिल करने के लिए कॉन्फ़िगर किया गया हर महीने का काम हो सकता है क्लाइंट या टोकन शामिल नहीं करने पड़ते. - नियमित अंतराल पर टोकन के टाइमस्टैंप को अपडेट करने के लिए, सर्वर लॉजिक जोड़ें. भले ही टोकन बदला हो या नहीं.
Android लॉजिक का इस्तेमाल करके, टोकन अपडेट करने के लिए दिए गए उदाहरण WorkManager, देखें क्लाउड से मैसेज के टोकन मैनेज करना देखें.
टाइमिंग पैटर्न चाहे जो भी हो, टोकन को समय-समय पर अपडेट करना न भूलें. अगर आप महीने में एक बार अपडेट करने की फ़्रीक्वेंसी, बैटरी के असर के बीच अच्छा संतुलन बनाती है और इनऐक्टिव रजिस्ट्रेशन टोकन का पता लगाना. यह रीफ़्रेश करने से, आपको सुनिश्चित करें कि निष्क्रिय होने वाला कोई भी डिवाइस अपना पंजीकरण रीफ़्रेश करेगा फिर से ऐक्टिव हो जाता है. पेज को बार-बार रीफ़्रेश करने का कोई फ़ायदा नहीं है से ज़रूरत नहीं है.
पुराने रजिस्ट्रेशन टोकन हटाएं
किसी डिवाइस पर मैसेज भेजने से पहले, पक्का करें कि डिवाइस के टाइमस्टैंप
रजिस्ट्रेशन टोकन, आपकी पुरानी जानकारी वाली विंडो की अवधि में है. उदाहरण के लिए, आपके
Cloud Functions for Firebase को लागू करके हर दिन जांच करके यह पक्का किया जा सकता है कि
टाइमस्टैंप, पुरानी जानकारी वाली विंडो की तय अवधि के अंदर का है, जैसे कि const
EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 30;
. इसके बाद, पुराने टोकन हटाएं:
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(); });
});
विषयों के पुराने टोकन की सदस्यता छोड़ें
अगर विषयों का इस्तेमाल किया जाता है, तो हो सकता है कि आप विषयों से पुराने टोकन का रजिस्ट्रेशन रद्द करना चाहें की सदस्यता ली हुई है. इसमें दो चरण शामिल हैं:
- आपके ऐप्लिकेशन को महीने में एक बार, विषयों की सदस्यता फिर से लेनी चाहिए. ऐसा तब भी होना चाहिए, जब रजिस्ट्रेशन टोकन में बदलाव होता है. इससे एक समस्या अपने-आप ठीक हो जाती है, जहां किसी ऐप्लिकेशन के फिर से चालू होने पर, सदस्यताएं अपने-आप फिर से दिखने लगती हैं.
- अगर कोई ऐप्लिकेशन इंस्टेंस एक महीने से (या आपकी पुरानी जानकारी वाली विंडो) कुछ समय से इस्तेमाल में नहीं है, तो आपको को उन विषयों की सदस्यता छोड़ देनी चाहिए जो Firebase एडमिन SDK टूल की मदद से FCM बैकएंड से, टॉपिक मैपिंग से जुड़ा टोकन मिटाएं.
इन दो चरणों का फ़ायदा यह है कि अगर आपके फ़ैनआउट की संख्या तेज़ी से बढ़ जाती है, तो प्रमोट करने के लिए, पुराने टोकन कम होते हैं. साथ ही, पुराने ऐप्लिकेशन के इंस्टेंस सदस्यता के फिर से चालू होने पर, अपने-आप फिर से सदस्यता लें.
डिलीवरी की सफलता का आकलन करना
मैसेज की डिलीवरी की सबसे सटीक जानकारी पाने के लिए, इस ईमेल को सिर्फ़ सक्रिय रूप से उपयोग किए जाने वाले ऐप इंस्टेंस के लिए संदेश. यह खास तौर पर तब ज़रूरी होता है, जब नियमित रूप से ऐसे विषयों पर मैसेज भेजें जिनके सदस्यों की संख्या बहुत ज़्यादा है; अगर कोई सदस्यता लेने वाले ऐसे सदस्य हैं जो असल में ऐक्टिव नहीं हैं, तो इसकी वजह से आपके चैनल की डिलीवरी पर असर पड़ता है समय के साथ आंकड़े महत्वपूर्ण हो सकते हैं.
किसी टोकन पर मैसेज टारगेट करने से पहले, इन बातों का ध्यान रखें:
- क्या Google Analytics, BigQuery में कैप्चर किया गया डेटा या दूसरे ट्रैकिंग सिग्नल हैं यह बताता है कि टोकन चालू है?
- क्या एक समयावधि में, डिलीवरी की पिछली कोशिश लगातार फ़ेल हुई है?
- क्या आपके सर्वर पर, रजिस्ट्रेशन टोकन पिछले महीने अपडेट किया गया है?
- Android डिवाइसों के लिए, FCM Data API
रिपोर्ट करने की वजह से, मैसेज डिलीवर नहीं होने की बड़ी संख्या
droppedDeviceInactive
?
डिलीवरी के बारे में ज़्यादा जानकारी के लिए, यहां देखें मैसेज डिलीवरी को समझना.