与firebase onDisconnect反应本机
Posted
技术标签:
【中文标题】与firebase onDisconnect反应本机【英文标题】:react native with firebase onDisconnect 【发布时间】:2018-09-26 17:33:06 【问题描述】:我构建了 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);
)
【问题讨论】:
【参考方案1】:一旦您建立了 firebase onDisconnect()
操作,该操作就会在 FireBase RealTime Sever 上启动。它会检查您的用户是否可以执行写操作,如果无效则传递相同的回调。
它还会检查连接状态。当您的连接丢失 或超时或被客户端故意关闭时,将调用连接。
您问题的第二部分取决于导航的性质,组件是否卸载从而与服务器断开连接或它是否嵌套在同一内部。
根据docs,可以使用remove操作
确保在客户端断开连接时删除此位置的数据(由于关闭浏览器、导航到新页面或网络问题)
YourFireBaseRef.onDisconnect().remove((error) =>
// Do some stuff
);
还有一点需要注意的是
onDisconnect
操作只触发一次。如果您希望每次disconnect
发生时都发生操作,则需要在每次重新连接时重新建立onDisconnect 操作。
【讨论】:
我怎样才能看到它的调用?当连接丢失时它不会解雇我.. 我正在寻找一种方法来进行回调并在丢失连接或用户关闭时写入 firebase 已更新,您可以使用remove
查看,也可以查看备注。
我根据您的建议对其进行了更改,并且仅在 firebase 中删除,我希望它在 firebase 中更新为“在 firebase 中删除后离线”
检查您是否有写权限以及文档是否存在userStatusFirestoreRef.set(isOfflineForFirestore, merge: true )
以合并文档。以上是关于与firebase onDisconnect反应本机的主要内容,如果未能解决你的问题,请参考以下文章
无法建立与 Firebase 版本不兼容的原因,并且相机反应本机
与 react-redux-firebase 反应 isLoaded 是真的, isEmpty 似乎是假的,但 firebase.auth().currentUser 是 null - 可能是啥原因?