我构建了 React native 应用程序,并尝试在用户关闭应用程序时创建事件,因此它在 firebase 中将状态更新为“离线”。 我做的是
import React, { Component } from 'react'
import Router from './src/Router'
import firebase from 'react-native-firebase';
export default class App extends Component {
constructor(props){
super(props)
this.state = {
uid: '',
userStatusDatabaseRef :'',
userStatusFirestoreRef: ''
}
}
componentWillMount() {
firebase.auth().signInAnonymouslyAndRetrieveData().then((user) => {
var uid = firebase.auth().currentUser.uid;
console.log('uid', uid)
var userStatusDatabaseRef = firebase.database().ref('status/' + uid);
var isOfflineForDatabase = {
state: 'offline',
last_changed: firebase.database.ServerValue.TIMESTAMP,
};
var isOnlineForDatabase = {
state: 'online',
last_changed: firebase.database.ServerValue.TIMESTAMP,
};
var userStatusDatabaseRef = firebase.database().ref('status/' + uid);
var userStatusFirestoreRef = firebase.firestore().doc('status/' + uid);
var isOfflineForFirestore = {
state: 'offline',
last_changed: firebase.firestore.FieldValue.serverTimestamp(),
};
var isOnlineForFirestore = {
state: 'online',
last_changed: firebase.firestore.FieldValue.serverTimestamp(),
};
const connectedRef = firebase.database().ref(".info/connected");
connectedRef.on("value", function (snap) {
// validate if connection is established
if (snap.val() === true) {
// remove the user's record on the disconnect
userStatusDatabaseRef.onDisconnect().set(isOfflineForDatabase).then(()=>{
userStatusFirestoreRef.set(isOnlineForFirestore);
})
// then request user to enter their name
} else {
userStatusFirestoreRef.set(isOfflineForFirestore);
}
});
this.setState({userStatusDatabaseRef,userStatusFirestoreRef,uid})
})
}
render() {
return <Router />
}
componentWillUnmount(){
var isOfflineForFirestore = {
state: 'offline',
last_changed: firebase.firestore.FieldValue.serverTimestamp(),
};
this.state.userStatusFirestoreRef.set(isOfflineForFirestore);
}
}
首先,我想了解 onDisconnect 何时触发以及做什么。其次,当我导航到其他屏幕时,它会触发我,这不是我要找的,只有当用户从每个屏幕关闭应用程序时。我不想复制代码并写入每个组件,因为它不是正确的编码。我正在从每个屏幕/组件中寻找事件,用户可以离线或在线在 firebase 中更新
我更改了我的代码,它只在 firebase 而不是 firestore 中更新
const connectedRef = firebase.database().ref(".info/connected");
// validate if connection is established
if (snap.val() === true) {
userStatusFirestoreRef.set(isOnlineForDatabase);
userStatusDatabaseRef.set(isOnlineForDatabase)
// remove the user's record on the disconnect
userStatusDatabaseRef.onDisconnect().remove((error)=>{
userStatusDatabaseRef.set(isOfflineForFirestore);
userStatusFirestoreRef.set(isOfflineForFirestore);
})
// then request user to enter their name
} else {
userStatusFirestoreRef.set(isOfflineForFirestore);
}
});
为什么不将 firestore 中的值也设置为“离线”
userStatusDatabaseRef.onDisconnect().remove((error)=>{
userStatusDatabaseRef.set(isOfflineForFirestore); // it update only in firebase
userStatusFirestoreRef.set(isOfflineForFirestore);
})
最佳答案
一旦您建立了一个 firebase onDisconnect()
操作,该操作就会在 FireBase RealTime Sever 上启动。它会检查您的用户是否可以执行写操作并在无效时传递相同的回调。
它还会检查连接状态。当您的连接丢失或超时或客户端故意关闭时,将调用连接。
问题的第二部分取决于导航的性质,组件是否卸载从而与服务器断开连接,或者它是否嵌套在同一服务器内。
根据docs ,您可以使用删除操作
确保在客户端断开连接(由于关闭浏览器、导航到新页面或网络问题)时删除此位置的数据
YourFireBaseRef.onDisconnect().remove((error) => {
// Do some stuff
});
还有一点需要注意的是
onDisconnect
操作只触发一次。如果您希望每次发生断开连接
时都发生操作,则需要在每次重新连接时重新建立onDisconnect 操作。
关于javascript - 与 firebase onDisconnect react native ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49866427/