Firestore(Firebase)如何计算活跃/在线用户总数

时间:2018-05-28 04:05:00

标签: firebase google-cloud-firestore

我打算在下面创建一个具有以下功能的应用:

  • 无需注册或登录即可使用该应用

  • 每天,我的管理员会将10分钟(或更短)的音频文件上传到后端,并设置音频可供所有用户使用的时间。例如:上午10点

  • 在设置时间(早上9.55)之前5分钟,应用程序将开始计算打开应用程序并等待播放音频文件的用户总数。

  • 有效/在线用户数将是实时

我尝试了什么:

  • 每次用户打开音频屏幕时,该应用都会使用FirebaseAuth以匿名身份登录。当用户离开此屏幕时,使用FirebaseAuth注销。但是这种方法不起作用,因为当用户注销时,匿名用户仍然在Users表

我的问题:

  1. 使用这些功能,我可以使用firebase / firestore来实现吗?

  2. 计算活跃用户总数的最佳方法是什么?

1 个答案:

答案 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是目前同时连接的限制,这仅适用于测试期