与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:onDisconnect 事件何时触发?

Firebase onDisconnect()不起作用

来自 Firebase 推送通知的反应导航导航

无法建立与 Firebase 版本不兼容的原因,并且相机反应本机

与 react-redux-firebase 反应 isLoaded 是真的, isEmpty 似乎是假的,但 firebase.auth().currentUser 是 null - 可能是啥原因?

firebase.initializeApp 不是本机反应的功能