我打算在下面创建一个具有以下功能的应用:
无需注册或登录即可使用该应用
每天,我的管理员会将10分钟(或更短)的音频文件上传到后端,并设置音频可供所有用户使用的时间。例如:上午10点
在设置时间(早上9.55)之前5分钟,应用程序将开始计算打开应用程序并等待播放音频文件的用户总数。
有效/在线用户数将是实时。
我尝试了什么:
我的问题:
使用这些功能,我可以使用firebase / firestore来实现吗?
计算活跃用户总数的最佳方法是什么?
答案 0 :(得分:3)
您可以使用FirebaseAuth
将值写入数据库,如果auth返回有人正在使用该应用程序,请编写引用并继续在其上添加用户。
我的意思是,如果有在线用户,FirebaseAuth
将写入名为usersonline
的引用,其值为1,如果其他用户加入它将成为usersonline + 1
等等,然后您可以附加onChildEventListener
并使用onChildChanged
实时更新在线用户,因此,每次该子项更改(根据用户增加),它将在线显示用户
要在线递减用户,在注销并且AuthListener
不再看到登录用户后,每次用户注销时,您可以减少1,因此,如果用户注销, AuthListener将触发,每次发生这种情况时,您都可以使用usersonline - 1
修改您的孩子。
例如,当用户失去连接时,Firebase会设法将数据写入数据库。
// Write a string when this client loses connection
presenceRef.onDisconnect().setValue("I disconnected!");
您可以在离线功能中查看它:
https://firebase.google.com/docs/database/android/offline-capabilities
所以你想要实现的不是写("我断开连接!")而是将usersonline ref递减1,所以你将添加人并将其从那个孩子中删除,就像实时在线用户一样
该文档的这个片段非常适合实现您的目标
DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
connectedRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
boolean connected = snapshot.getValue(Boolean.class);
if (connected) {
System.out.println("connected"); // tell your usersonline ref to increment by 1
} else {
System.out.println("not connected"); //then if the user is not longer connected just decrement your usersonline by 1
}
}
@Override
public void onCancelled(DatabaseError error) {
System.err.println("Listener was cancelled");
}
});
就同步连接而言,这适用于Firebase实时数据库:
Spark计划限制为100,无法提升。火焰和火焰 计划每个数据库的并发连接数限制为100,000。 如果您需要超过100,000个同时连接,请联系 Firebase支持。
https://firebase.google.com/docs/firestore/quotas对于Firestore,100k是目前同时连接的限制,这仅适用于测试期。