คุณอาจพบว่ามีประโยชน์ในการตรวจสอบว่าผู้ใช้หรืออุปกรณ์ใดของคุณออนไลน์อยู่ หรือที่เรียกว่าการตรวจจับ "การแสดงตน" ขึ้นอยู่กับประเภทของแอปที่คุณกำลังสร้าง
ตัวอย่างเช่น หากคุณกำลังสร้างแอป เช่น เครือข่ายโซเชียล หรือปรับใช้กลุ่มอุปกรณ์ IoT คุณสามารถใช้ข้อมูลนี้เพื่อแสดงรายชื่อเพื่อนที่ออนไลน์และสนทนาได้ฟรี หรือจัดเรียงอุปกรณ์ IoT ของคุณตาม "ดูล่าสุด ”
Cloud Firestore ไม่รองรับการแสดงตนโดยกำเนิด แต่คุณสามารถใช้ประโยชน์จากผลิตภัณฑ์ Firebase อื่นๆ เพื่อสร้างระบบการแสดงตนได้
โซลูชัน: ฟังก์ชันคลาวด์พร้อมฐานข้อมูลเรียลไทม์
หากต้องการเชื่อมต่อ Cloud Firestore กับฟีเจอร์การแสดงตนดั้งเดิมของ Firebase Realtime Database ให้ใช้ฟังก์ชันคลาวด์
ใช้ฐานข้อมูลเรียลไทม์เพื่อรายงานสถานะการเชื่อมต่อ จากนั้นใช้ฟังก์ชันคลาวด์เพื่อมิเรอร์ข้อมูลนั้นไปยัง 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 Firestore
หากคุณยังไม่ได้เพิ่ม Realtime Database ให้กับโปรเจ็กต์ของคุณและรวมโซลูชันการแสดงตนข้างต้น
ถัดไป คุณจะซิงโครไนซ์สถานะการแสดงตนกับ Cloud Firestore ด้วยวิธีการต่อไปนี้:
- ภายในเครื่องไปยังแคช Cloud Firestore ของอุปกรณ์ออฟไลน์ เพื่อให้แอปรู้ว่าออฟไลน์อยู่
- การใช้ฟังก์ชันคลาวด์ทั่วโลกเพื่อให้อุปกรณ์อื่นๆ ทั้งหมดที่เข้าถึง 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}
และใช้ข้อมูลเพื่อเปลี่ยน UI ของคุณเพื่อแสดงสถานะการเชื่อมต่อได้
เว็บ
userStatusFirestoreRef.onSnapshot(function(doc) { var isOnline = doc.data().state == 'online'; // ... use isOnline });
กำลังอัปเดต Cloud Firestore ทั่วโลก
แม้ว่าแอปพลิเคชันของเราจะรายงานสถานะออนไลน์อย่างถูกต้อง แต่สถานะนี้จะไม่ถูกต้องในแอป Cloud Firestore อื่นๆ เนื่องจากการเขียนสถานะ "ออฟไลน์" ของเราเป็นแบบโลคัลเท่านั้น และจะไม่ซิงค์เมื่อการเชื่อมต่อได้รับการกู้คืน เพื่อตอบโต้สิ่งนี้ เราจะใช้ฟังก์ชันคลาวด์ที่คอยดู status/{uid}
ในฐานข้อมูลเรียลไทม์ เมื่อค่าฐานข้อมูลเรียลไทม์เปลี่ยนแปลง ค่าจะซิงค์กับ Cloud Firestore เพื่อให้สถานะของผู้ใช้ทั้งหมดถูกต้อง
โหนด 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 ของคุณสามารถปรับขนาดได้และมีประสิทธิภาพ แต่มีข้อจำกัดบางประการ:
- Debouncing - เมื่อฟังการเปลี่ยนแปลงแบบเรียลไทม์ใน Cloud Firestore โซลูชันนี้มีแนวโน้มที่จะทำให้เกิดการเปลี่ยนแปลงหลายอย่าง หากการเปลี่ยนแปลงเหล่านี้กระตุ้นให้เกิดเหตุการณ์มากกว่าที่คุณต้องการ ให้ทำการดีดกลับเหตุการณ์ Cloud Firestore ด้วยตนเอง
- การเชื่อมต่อ - การใช้งานนี้จะวัดการเชื่อมต่อกับฐานข้อมูลเรียลไทม์ ไม่ใช่กับ Cloud Firestore หากสถานะการเชื่อมต่อกับแต่ละฐานข้อมูลไม่เหมือนกัน โซลูชันนี้อาจรายงานสถานะการแสดงตนที่ไม่ถูกต้อง
- Android - บน Android ฐานข้อมูลเรียลไทม์จะตัดการเชื่อมต่อจากแบ็กเอนด์หลังจากไม่มีการใช้งานเป็นเวลา 60 วินาที การไม่ใช้งานหมายถึงไม่มีผู้ฟังที่เปิดอยู่หรือการดำเนินการที่ค้างอยู่ เพื่อให้การเชื่อมต่อเปิดอยู่ เราขอแนะนำให้คุณเพิ่มตัวฟังเหตุการณ์ค่าให้กับเส้นทางนอกเหนือจาก
.info/connected
ตัวอย่างเช่น คุณสามารถทำFirebaseDatabase.getInstance().getReference((new Date()).toString()).keepSynced()
เมื่อเริ่มต้นแต่ละเซสชัน สำหรับข้อมูลเพิ่มเติม โปรดดูที่ การตรวจหาสถานะการเชื่อมต่อ