【问题标题】:I want to Maintain User Presence in Firestore or Firebase of one device from multiple devices who accesses the single user credentials我想在访问单个用户凭据的多台设备中保持一台设备在 Firestore 或 Firebase 中的用户存在
【发布时间】:2018-09-14 19:24:48
【问题描述】:

我想保持用户在 Firestore 或 Firebase 中的存在。实际上,由多个移动设备和一台平板电脑处理的单个用户帐户以及该平板电脑维护或执行操作或提供针对我的 Firestore 数据更改的功能。所以我需要在 Firestore 或 Firebase 中保持平板电脑的存在,以便其他移动设备了解平板电脑是否工作。

所以请给我一些解决方案。

我使用 Firebase 节点检查连接状态。下面的代码,但我没有给出正确的响应,例如当我从路由器上拔下网线时,onDataChange not fire.for 断开连接。

final FirebaseDatabase database = FirebaseDatabase.getInstance();
        final DatabaseReference myConnectionsRef = database.getReference(FirebaseAuth.getInstance().getCurrentUser().getUid()+"/tab/connections");

        // stores the timestamp of my last disconnect (the last time I was seen online)
        final DatabaseReference lastOnlineRef = database.getReference(FirebaseAuth.getInstance().getCurrentUser().getUid()+"/tab/lastOnline");

        final DatabaseReference connectedRef = database.getReference(".info/connected");
        connectedRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                boolean connected = snapshot.getValue(Boolean.class);
                if (connected) {
                    DatabaseReference con = myConnectionsRef.push();

                    // when this device disconnects, remove it
                    con.onDisconnect().removeValue();

                    // when I disconnect, update the last time I was seen online
                    lastOnlineRef.onDisconnect().setValue(ServerValue.TIMESTAMP);

                    long timestamp = Calendar.getInstance().getTimeInMillis();

                    // add this device to my connections list
                    // this value could contain info about the device or a timestamp too
                    con.setValue(Boolean.TRUE);

                }else {

                    long timestamp2 = Calendar.getInstance().getTimeInMillis();


                }
            }

            @Override
            public void onCancelled(DatabaseError error) {
                System.err.println("Listener was cancelled at .info/connected");
            }
        });

【问题讨论】:

    标签: java android firebase firebase-realtime-database google-cloud-firestore


    【解决方案1】:

    您可以在登录后使用 Firebase 实时数据库上的设备 ID 更新已连接标志。

    所以所有其他设备都会知道其他设备。

    在注销/关闭应用程序时,将该标志设为 false。

    【讨论】:

    • 但我有一个问题是 firebase 如何维护 info/isConnected?它取决于单个设备还是多个设备?我读到它在firebase服务器上的设备存在上保持连接响应。但我不明白到底发生了什么。
    • 您可以创建一个带有 deviceID 和布尔标志 isConnected 的 bean,并将其存储在 firebase 数据库中,您必须创建此功能而与 firebase 无关
    【解决方案2】:

    即使您使用的是 Firebase 实时数据库或新的 Cloud Firestore,您在代码中所做的操作也称为用户和连接之间的1:1 关系。您正在寻找可能从多个设备连接的用户。如果您使用的标志可以根据连接状态保存 true 或 false 值,那么您将遇到问题,即如果用户将与其中一个设备断开连接,则来自该特定设备的 onDisconnect() 方法被调用并将online 设置为false,而用户可能仍连接在其他设备上。

    在我看来,您不应依赖用户与其连接之间的 1:1 关系。官方文档中的example 将连接视为一个集合,并假设该用户只要有任何“connect Id”(由push() 生成)方法留给该用户就已连接。我建议你做同样的事情,以防止难以调试竞争条件和连接问题

    【讨论】:

    • 实际上我从单个设备而不是所有设备更新 onDisconnected 时间戳。在我们的案例中,其中有多个设备,一个是平板电脑,所有其他设备都是移动设备。移动应用程序和平板电脑应用程序的代码不同。所以我想保持平板电脑连接状态而不是移动设备。所有手机和平板电脑都访问相同的用户数据。所以我为平板应用编写了上面的代码
    • 这与我已经说过的完全一样。您正在从单个设备进行更新,而不是从所有设备进行更新,这就是问题所在。如果要保持平板电脑连接状态,则需要连接。如果您断开连接,所有其他设备将保持连接。解决方案如上例所示。你试过了吗?
    猜你喜欢
    • 2016-09-27
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    相关资源
    最近更新 更多