我正在研究一个具有每个玩家在线/离线状态的手机游戏。因此,我们决定将Firebase集成为解决方案。但是,当我们进行更多挖掘时,我们发现许多API并非我们所期望的。
这是关于我们所做的简短概念。
Presence:
{
UserID:
{
Unique Key1:
{
Online: True
}
}
}
_myPresenceRef = _presenceRef.Child(_oid).Push();
_myPresenceRef.OnDisconnect().RemoveValue().ContinueWithOnMainThread(task =>
{
if (!task.IsFaulted && !task.IsCanceled)
{
presenceData["Online"] = true;
_myPresenceRef.SetValueAsync(presenceData);
}
});
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令牌每小时都会过期并自动刷新。我发现三种情况是无法预期的。
SetEditorAuthUserId
使用p12键授权。 在上述情况下,即使关闭应用程序后,实时数据库中的记录也不会被删除。那就是数据永远存在于实时数据库中。
Presence:
{
UserID:
{
Unique Key1:
{
Online: True
}
}
}
即使刷新ID令牌,看来onDisconnect
事件也不再起作用。
根据我从Internet和官方文档中搜索到的内容,它表明服务器运行onDisconnect
事件时,它将检查操作是否仍然有效。如果没有,它将不会采取任何措施。
这是我的问题
onDisconnect
的行为?如果没有,谁能解释发生了什么事?onDisconnect
问题。.info/connected
值更改。这是预期的吗?如果是这样,为什么它不触发onDisconnect
?感谢您提前帮助我。请让我知道是否还有任何不清楚的地方。
更新:
onDisconnect
不起作用的根本原因是我对实时数据库有规定。
{
"rules": {
"presence": {
"$uid": {
".write": "$uid === auth.uid",
".read": true
}
},
".read": false,
".write": false,
}
}
onDisconnect
会采取措施。但是,当它运行removeValue
操作时,由于需要授权uid的“ .write”规则而被禁止。
听起来很合理。但是对我来说,事实并非如此。太棘手了。作为用户,我希望将操作注册到“ onDisconnect”时没有任何错误。无论以后发生什么,它都应该执行它。因为那时我是授权用户。
在某些情况下,事情变得奇怪。让我解释更多。
".info/connected"
更改事件。从代码中,它将把一个新节点推送到状态,并且由于removeValue
,id token expiration
操作将不起作用。现在很有意义。".info/connected"
更改的事件,并且'onDisconnect'也不会触发。就像什么都没有发生一样。".info/connected"
更改事件。从代码中,它将把一个新节点推入状态,并且由于removeValue
,id token expiration
操作将不起作用。从上述情况来看,Firebase的行为似乎因平台而异,这很烦人。