Cloud Firestore में अपनी मौजूदगी बनाएं

आपका ऐप्लिकेशन किस तरह का है, इसके आधार पर यह पता लगाना आपके लिए फ़ायदेमंद हो सकता है कि आपके कौनसे उपयोगकर्ता या डिवाइस, फ़िलहाल ऑनलाइन हैं. इसे "मौजूदगी" का पता लगाना भी कहा जाता है.

उदाहरण के लिए, अगर सोशल नेटवर्क जैसा कोई ऐप्लिकेशन बनाया जा रहा है या स्मार्ट डिवाइसों का कोई ग्रुप डिप्लॉय किया जा रहा है, तो इस जानकारी का इस्तेमाल करके उन दोस्तों की सूची दिखाई जा सकती है जो ऑनलाइन हैं और चैट करने के लिए उपलब्ध हैं. इसके अलावा, अपने स्मार्ट डिवाइसों को "पिछली बार देखा गया" के हिसाब से क्रम में लगाया जा सकता है.

Cloud Firestore मौजूदा तौर पर, मौजूदगी की सुविधा नहीं देता. हालांकि, आपके पास यह करने का विकल्प है दूसरे Firebase प्रॉडक्ट की मदद से मौजूदगी वाला सिस्टम बनाया जा सकता है.

समाधान: रीयलटाइम डेटाबेस के साथ Cloud Functions

Cloud Firestore को Firebase रीयलटाइम डेटाबेस की नेटिव प्रज़ेंस सुविधा से कनेक्ट करने के लिए, Cloud Functions का इस्तेमाल करें.

कनेक्शन की स्थिति की जानकारी देने के लिए रीयलटाइम डेटाबेस का इस्तेमाल करें. इसके बाद, Cloud Functions का इस्तेमाल करके, उस डेटा को Cloud Firestore में मिरर कर सकते हैं.

रीयलटाइम डेटाबेस में मौजूदगी की जानकारी का इस्तेमाल करना

सबसे पहले, देखें कि रीयल टाइम डेटाबेस में, प्रॉडक्ट की उपलब्धता की जानकारी देने वाला पारंपरिक सिस्टम कैसे काम करता है.

वेब

// Fetch the current user's ID from Firebase Authentication.
var uid = firebase.auth().currentUser.uid;

// Create a reference to this user's specific status node.
// This is where we will store data about being online/offline.
var userStatusDatabaseRef = firebase.database().ref('/status/' + uid);

// We'll create two constants which we will write to 
// the Realtime database when this device is offline
// or online.
var isOfflineForDatabase = {
    state: 'offline',
    last_changed: firebase.database.ServerValue.TIMESTAMP,
};

var isOnlineForDatabase = {
    state: 'online',
    last_changed: firebase.database.ServerValue.TIMESTAMP,
};

// Create a reference to the special '.info/connected' path in 
// Realtime Database. This path returns `true` when connected
// and `false` when disconnected.
firebase.database().ref('.info/connected').on('value', function(snapshot) {
    // If we're not currently connected, don't do anything.
    if (snapshot.val() == false) {
        return;
    };

    // If we are currently connected, then use the 'onDisconnect()' 
    // method to add a set which will only trigger once this 
    // client has disconnected by closing the app, 
    // losing internet, or any other means.
    userStatusDatabaseRef.onDisconnect().set(isOfflineForDatabase).then(function() {
        // The promise returned from .onDisconnect().set() will
        // resolve as soon as the server acknowledges the onDisconnect() 
        // request, NOT once we've actually disconnected:
        // https://firebase.google.com/docs/reference/js/firebase.database.OnDisconnect

        // We can now safely set ourselves as 'online' knowing that the
        // server will mark us as offline once we lose connection.
        userStatusDatabaseRef.set(isOnlineForDatabase);
    });
});

इस उदाहरण में, रीयलटाइम डेटाबेस की मौजूदगी वाला पूरा सिस्टम है. यह कई बार डिसकनेक्ट होने, क्रैश होने वगैरह की समस्याओं को हल करता है.

Cloud Firestore से कनेक्ट किया जा रहा है

Cloud Firestore में मिलता-जुलता समाधान लागू करने के लिए, पहले उसी का इस्तेमाल करें रीयलटाइम डेटाबेस कोड चुनें. इसके बाद, रीयलटाइम डेटाबेस को बनाए रखने के लिए Cloud Functions का इस्तेमाल करें और Cloud Firestore सिंक में है.

अगर आपने पहले से ही अपने प्रोजेक्ट में रीयलटाइम डेटाबेस नहीं जोड़ा है, तो उसे जोड़ें और ऊपर दिया गया ऑनलाइन होने की जानकारी देने वाला तरीका शामिल करें.

इसके बाद, आपको यहां दिए गए तरीकों से, Cloud Firestore पर मौजूदगी की स्थिति सिंक करनी होगी:

  1. स्थानीय तौर पर, ऑफ़लाइन डिवाइस के Cloud Firestore कैश मेमोरी में सेव किया जाता है, ताकि ऐप्लिकेशन को पता चले कि वह डिवाइस ऑफ़लाइन है.
  2. दुनिया भर में Cloud फ़ंक्शन का इस्तेमाल करना, ताकि दूसरे सभी डिवाइस Cloud Firestore जानते हैं कि यह डिवाइस ऑफ़लाइन है.

Cloud Firestore की लोकल कैश मेमोरी अपडेट की जा रही है

आइए, पहली समस्या को ठीक करने के लिए ज़रूरी बदलावों पर नज़र डालें - Cloud Firestore की लोकल कैश मेमोरी को अपडेट करना.

वेब

// ...
var userStatusFirestoreRef = firebase.firestore().doc('/status/' + uid);

// Firestore uses a different server timestamp value, so we'll 
// create two more constants for Firestore state.
var isOfflineForFirestore = {
    state: 'offline',
    last_changed: firebase.firestore.FieldValue.serverTimestamp(),
};

var isOnlineForFirestore = {
    state: 'online',
    last_changed: firebase.firestore.FieldValue.serverTimestamp(),
};

firebase.database().ref('.info/connected').on('value', function(snapshot) {
    if (snapshot.val() == false) {
        // Instead of simply returning, we'll also set Firestore's state
        // to 'offline'. This ensures that our Firestore cache is aware
        // of the switch to 'offline.'
        userStatusFirestoreRef.set(isOfflineForFirestore);
        return;
    };

    userStatusDatabaseRef.onDisconnect().set(isOfflineForDatabase).then(function() {
        userStatusDatabaseRef.set(isOnlineForDatabase);

        // We'll also add Firestore set here for when we come online.
        userStatusFirestoreRef.set(isOnlineForFirestore);
    });
});

इन बदलावों के साथ अब हमने यह पक्का किया है कि स्थानीय Cloud Firestore राज्य हमेशा डिवाइस की ऑनलाइन/ऑफ़लाइन स्थिति दिखाती है. इसका मतलब है कि आपको /status/{uid} दस्तावेज़ और कनेक्शन दिखाने के लिए अपने यूज़र इंटरफ़ेस (यूआई) को बदलने के लिए डेटा का इस्तेमाल करें स्थिति.

वेब

userStatusFirestoreRef.onSnapshot(function(doc) {
    var isOnline = doc.data().state == 'online';
    // ... use isOnline
});

Cloud Firestore को दुनिया भर में अपडेट किया जा रहा है

हालांकि हमारा ऐप्लिकेशन ऑनलाइन मौजूदगी की सही जानकारी अपनी रिपोर्ट देता है, लेकिन यह स्थिति दूसरे Cloud Firestore ऐप्लिकेशन में अभी सही नहीं होगा, क्योंकि हमारी "ऑफ़लाइन" सुविधा है स्टेटस में बदलाव करने की सुविधा सिर्फ़ लोकल है. कनेक्शन वापस पाने के बाद, उसे सिंक नहीं किया जाएगा. इस समस्या को हल करने के लिए, हम ऐसे Cloud फ़ंक्शन का इस्तेमाल करेंगे जो रीयलटाइम डेटाबेस में status/{uid} पाथ को मॉनिटर करता है. जब रीयल टाइम डेटाबेस की वैल्यू बदलती है, तो वह वैल्यू Cloud Firestore के साथ सिंक हो जाएगी, ताकि सभी उपयोगकर्ताओं के स्टेटस सही हों.

Node.js

firebase.firestore().collection('status')
    .where('state', '==', 'online')
    .onSnapshot(function(snapshot) {
        snapshot.docChanges().forEach(function(change) {
            if (change.type === 'added') {
                var msg = 'User ' + change.doc.id + ' is online.';
                console.log(msg);
                // ...
            }
            if (change.type === 'removed') {
                var msg = 'User ' + change.doc.id + ' is offline.';
                console.log(msg);
                // ...
            }
        });
    });

इस फ़ंक्शन को डिप्लॉय करने के बाद, आपके पास Cloud Firestore के साथ काम करने वाला पूरी तरह से तैयार प्रज़ेंस सिस्टम होगा. नीचे ऐसे सभी उपयोगकर्ताओं की निगरानी का एक उदाहरण दिया गया है, जो where() क्वेरी का इस्तेमाल करके, ऑनलाइन आएं या ऑफ़लाइन जाएं.

वेब

firebase.firestore().collection('status')
    .where('state', '==', 'online')
    .onSnapshot(function(snapshot) {
        snapshot.docChanges().forEach(function(change) {
            if (change.type === 'added') {
                var msg = 'User ' + change.doc.id + ' is online.';
                console.log(msg);
                // ...
            }
            if (change.type === 'removed') {
                var msg = 'User ' + change.doc.id + ' is offline.';
                console.log(msg);
                // ...
            }
        });
    });

सीमाएं

अपने Cloud Firestore ऐप्लिकेशन में मौजूदगी जोड़ने के लिए रीयलटाइम डेटाबेस का इस्तेमाल करना बढ़ाने लायक और असरदार, लेकिन इसकी कुछ सीमाएं हैं:

  • डिबॉउंस करना - जब रीयल टाइम में होने वाले बदलावों को सुना जाता है Cloud Firestore, यह समाधान वेबसाइट के लिए कई बदलाव. अगर इन बदलावों की वजह से, आपकी ज़रूरत से ज़्यादा इवेंट ट्रिगर होते हैं, तो मैन्युअल तौर पर Cloud Firestore इवेंट को खारिज करना.
  • कनेक्शन - इस तरीके से Cloud Firestore के बजाय, रीयल टाइम डेटाबेस के कनेक्शन का आकलन किया जाता है. अगर आपने हर डेटाबेस के लिए स्थिति एक जैसी नहीं होती. इसलिए, यह समाधान मौजूदगी की गलत स्थिति.
  • Android - Android पर, रीयलटाइम डेटाबेस 60 सेकंड तक कोई गतिविधि न होने पर बैकएंड करें. कोई गतिविधि नहीं होने का मतलब है कि कोई भी व्यक्ति आपका चेहरा नहीं सुन सकता या कार्रवाई नहीं हुई है. कनेक्शन को खुला रखने के लिए, हमारा सुझाव है कि आप .info/connected के अलावा किसी पाथ में वैल्यू इवेंट लिसनर जोड़ें. उदाहरण के लिए, FirebaseDatabase.getInstance().getReference((new Date()).toString()).keepSynced() किया जा सका . ज़्यादा जानकारी के लिए, कनेक्शन की स्थिति का पता लगाना लेख पढ़ें.