firebase 统计在线用户并在全球计数器中更新

Posted

技术标签:

【中文标题】firebase 统计在线用户并在全球计数器中更新【英文标题】:firebase count online users and update in global counter 【发布时间】:2018-11-19 18:13:36 【问题描述】:

我想计算firebase中的在线用户并将值存储在firebase中的online_users下,当用户连接到应用程序以增加online_users以及当用户从应用程序断开连接以减少时。 我建立了firebase功能

export const countOnlineUser = functions.database
.ref('/UserStatus/uid')
.onWrite((change, context) => 
    var collectionRef = change.after.ref.parent;
    var countRef = collectionRef.child('online_users');

    let increment = 0;
    if (change.after.exists() && !change.before.exists()) 
        increment = 1;
     else if (!change.after.exists() && change.before.exists()) 
        increment = -1;
     else 
        return null;
    

    // Return the promise from countRef.transaction() so our function
    // waits for this async event to complete before it exits.
    return countRef.transaction((current) => 
         console.log(current)
        if (current == null) 
            return 0;
        
        else 
            return (current || 0) + increment;
        

        ).then(() => 
            return console.log('Counter updated.');
        );

);

每次用户连接到应用程序时客户端更新用户

constructor() 
        firebase.auth().onAuthStateChanged((user) => 
            if (user) 
                const  uid, phoneNumber  = firebase.auth().currentUser._user
                 UserStore.setUID(uid)
                 this.setListenConnection()

            

        )


    setListenConnection = async () => 

        this.userStatusDatabaseRef = firebaseRef(`UserStatus/$UserStore.user.uid`)

        firebaseRef('.info/connected').on('value', async connected => 
            if (connected.val() === false) 
                return
            

            await firebaseRef(`UserStatus/$UserStore.user.uid`).onDisconnect().remove()
            this.userStatusDatabaseRef.set( state: 'online', last_changed: firebase.firestore.FieldValue.serverTimestamp() ,  merge: true )
        )
    

我对这些功能有一些疑问 有时 online_users 是负面的,我想阻止它。 有时我得到的交易电流是空的。

我该如何解决?

【问题讨论】:

您似乎已经从functions-samples repo) 那里得到了基本计数器,众所周知,它非常可靠。解决问题的关键是弄清楚它何时发生。 当前代码中的一个错误是您假设每个用户只有一个连接。这根本无法保证。用户可以在多台设备上使用该应用程序,甚至可以在一台设备上使用多个连接(尽管只有一个活动连接)。我强烈建议您遵循文档中的模式,该模式为每个连接使用一个推送 ID:firebase.google.com/docs/database/web/…。 “连接到应用程序”究竟是什么意思? @FrankvanPuffelen 我通过保存具有唯一设备 ID 的 uid 解决了以其他方式连接多个设备的问题。这样用户就不能在多个设备中使用其他设备。当他尝试时,它会将他从第二台设备中抛出并使用 firebase 退出。我试图了解我的功能有什么不好的地方。我检查了你在functions-sample中发布的例子,它看起来就像我所做的一样...... 另一种方法是采用不同的计数方法。您复制的函数示例尝试计算增量,因此将 +1 和 -1 计算为添加/删除的项目。您还可以在发生更改时简单地重新计算所有子节点,方法是触发/UserStatus,然后简单地将值写入countRef.set(change.after.numChildren())。它更简单,并且(虽然效率不高)将查找扩展到几十万在线用户(只要您每次使用的数据很少)。 【参考方案1】:

Performance Monitoring 公开会话或当前用户,但它似乎仅适用于移动应用程序 (ios/android)。

Google Analytics for Firebase 数据收集通过 Google Analytics for Firebase 收集的信息类型

默认实现包括:

用户和会话数 会话持续时间 操作系统 设备型号 地理 首次发布 应用打开 应用更新 应用内购买

关于云函数,请查看Writing and Viewing Logs。如果可行,这将是 API。

【讨论】:

嘿,罗恩,听起来不错。我查看了 react-native-firebase 文档,但没有看到任何方法可以获取用户数量和使用 firebase 分析的会话。文档链接github.com/invertase/react-native-firebase-docs/blob/master/…

以上是关于firebase 统计在线用户并在全球计数器中更新的主要内容,如果未能解决你的问题,请参考以下文章

如何统计网站在线人数?

多线程 Firebase 功能

firebase 分析中的事件“first_open”如何计数?

Flutter Firebase 儿童计数

网站需要显示在线访问人数

遇到的坑:在线用户统计的实现