Firebase OnDisconnect和“ .info / connected”问题

时间:2019-11-25 13:34:46

标签: c# unity3d firebase-realtime-database

我正在研究一个具有每个玩家在线/离线状态的手机游戏。因此,我们决定将Firebase集成为解决方案。但是,当我们进行更多挖掘时,我们发现许多API并非我们所期望的。

这是关于我们所做的简短概念。

  1. 我们有一个类似
  2. 的结构
Presence: 
{
    UserID:
    {
        Unique Key1:
        {
            Online: True
        }
    }
}
  1. 初始化firebase时,将节点推送到实时数据库。代码如下。
_myPresenceRef = _presenceRef.Child(_oid).Push();
_myPresenceRef.OnDisconnect().RemoveValue().ContinueWithOnMainThread(task =>
{
    if (!task.IsFaulted && !task.IsCanceled)
    {
        presenceData["Online"] = true;

        _myPresenceRef.SetValueAsync(presenceData);
    }
});
  1. 我们还注册连接值更改事件,以处理断开情况。示例代码如下。
private void _InitializeListeners()
{
    _connectionRef = db.GetReference(".info/connected");
    _connectionRef.ValueChanged += _OnConnectionValueChanged;
}

private void _OnConnectionValueChanged(object sender, ValueChangedEventArgs args)
{
    var s = args.Snapshot;
    if (s == null)
        return;

    if ((bool) s.GetValue(false))
    {
        _myPresenceRef = _presenceRef.Child(_oid).Push();
        _myPresenceRef.OnDisconnect().RemoveValue().ContinueWithOnMainThread(task =>
        {
            if (!task.IsFaulted && !task.IsCanceled)
            {
                presenceData[Online] = true;
                _myPresenceRef.SetValueAsync(presenceData);
            }
        });
    }
    else
    {
        _myPresenceRef = null;
    }
}        

从上面开始,目标是当用户连接到游戏时,我们会将用户的状态数据推送到实时数据库中。同时,当服务器发现用户已断开连接时,我们将服务器设置为“ ondisconnect”以删除状态数据。

一切正常;但是,当id令牌过期时,事情变得很奇怪。 据我所知,ID令牌每小时都会过期并自动刷新。我发现三种情况是无法预期的。

  1. 在统一编辑器中,我们已通过SetEditorAuthUserId使用p12键授权。
  2. 在android后台运行一个小时,然后返回应用程序。
  3. 在android后台运行一个小时后,直接关闭该应用。

在上述情况下,即使关闭应用程序后,实时数据库中的记录也不会被删除。那就是数据永远存在于实时数据库中。

Presence: 
{
    UserID:
    {
        Unique Key1:
        {
            Online: True
        }
    }
}

即使刷新ID令牌,看来onDisconnect事件也不再起作用。

根据我从Internet和官方文档中搜索到的内容,它表明服务器运行onDisconnect事件时,它将检查操作是否仍然有效。如果没有,它将不会采取任何措施。

这是我的问题

  1. 我是否正确理解onDisconnect的行为?如果没有,谁能解释发生了什么事?
  2. 如果我是正确的话,那么刷新ID令牌后人们如何处理onDisconnect问题。
  3. 似乎“刷新ID令牌”将触发.info/connected值更改。这是预期的吗?如果是这样,为什么它不触发onDisconnect

感谢您提前帮助我。请让我知道是否还有任何不清楚的地方。

  • Firebase版本:6.0.0
  • 统一版本:2018.4.4f1

更新:

onDisconnect不起作用的根本原因是我对实时数据库有规定。

{
  "rules": {
    "presence": {
        "$uid": {
        ".write": "$uid === auth.uid",
        ".read": true
      }
    },
    ".read": false,
    ".write": false,
  }
}

onDisconnect会采取措施。但是,当它运行removeValue操作时,由于需要授权uid的“ .write”规则而被禁止。

听起来很合理。但是对我来说,事实并非如此。太棘手了。作为用户,我希望将操作注册到“ onDisconnect”时没有任何错误。无论以后发生什么,它都应该执行它。因为那时我是授权用户。

在某些情况下,事情变得奇怪。让我解释更多。

  1. 该应用程序在android平台上处于后台。 id令牌过期后,它将触发".info/connected"更改事件。从代码中,它将把一个新节点推送到状态,并且由于removeValueid token expiration操作将不起作用。现在很有意义。
  2. 该应用在android平台上处于前台。 id令牌过期后, 它不会触发".info/connected"更改的事件,并且'onDisconnect'也不会触发。就像什么都没有发生一样。
  3. 该应用程序正在统一编辑器上运行。 id令牌过期后,它将触发".info/connected"更改事件。从代码中,它将把一个新节点推入状态,并且由于removeValueid token expiration操作将不起作用。

从上述情况来看,Firebase的行为似乎因平台而异,这很烦人。

0 个答案:

没有答案