Firebase数据库不提交在线数据阻止监听器

4bo*_*lie 6 android firebase firebase-realtime-database

我正在使用Firebase数据库服务来同步用户数据.我启用了离线兼容性,问题是在使用几个月后,用户数据显然没有提交到在线数据库,因为用户电话系统阻止了应用程序的互联网连接.

在某些情况下,我设法引导用户启用"无限数据使用"选项,但并不适用于所有人.

在我的情况下,问题是听众:

void onDataChange(DataSnapshot var1);
Run Code Online (Sandbox Code Playgroud)

ValueEventListener当大量数据脱机存储而未提交时,不会触发from ,并阻止所有行为.

我没有在线存储限制,因为我有Blaze计划(支付消费).

事务也未提交,并触发"事务被后续集覆盖",错误代码为-9.

Firebase提供的连接检测器始终打印"未连接"

我也尝试过替代goOffline(),goOnline()但没有任何反应.

我不明白为什么手机会阻止我的应用程序同步,让像Facebook和Youtube这样的应用程序消耗大量的互联网数据.

此行为仅在Android设备上发生,在使用相同Firebase数据库的iOS手机上没有问题.

无法使用4g,WI-FI或VPN(使用Opera VPN).

更新1:

日志在启动时包含~10次:

11-13 21:12:28.477 15765 15856 D PersistentConnection: pc_0 - Scheduling connection attempt
11-13 21:12:28.477 15765 15856 D ConnectionRetryHelper: Scheduling retry in 26091ms
11-13 21:12:54.597 15765 15856 D PersistentConnection: pc_0 - Trying to fetch auth token
11-13 21:12:55.747 15765 15856 D PersistentConnection: pc_0 - Error fetching token: An internal error has occurred. [ 
TOKEN_EXPIRED ]
Run Code Online (Sandbox Code Playgroud)

当我尝试插入新数据时:

RepoOperation: Aborting transactions for path: [the path]
Run Code Online (Sandbox Code Playgroud)

4bo*_*lie 4

经过长时间的调查,我发现令牌没有自动刷新。

首先,检查当前用户是否登录FirebaseAuth.AuthStateListener

检查我是否需要刷新令牌

1) 检查应用程序是否有互联网连接:

    public static boolean isOnline(Context context)
    {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

        return networkInfo != null && networkInfo.isConnectedOrConnecting();
    }
Run Code Online (Sandbox Code Playgroud)

2)然后检查数据库是否已连接到: 检测连接状态

如果应用程序有互联网连接并且数据库未连接,那么我尝试刷新令牌:

try
{
    user.getIdToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>()
    {
        @Override
        public void onComplete(@NonNull Task<GetTokenResult> task)
        {
            if (task.isSuccessful())
            {
                //succcess
            } else
            {
                //need login again
            }
        }
    });
}catch(Exception e)
{
    //need login again
}
Run Code Online (Sandbox Code Playgroud)

如果出现异常或完成任务失败,那么我尝试再次登录用户。在大多数情况下,将是透明登录,因此不会向用户显示,因为将使用 sdk 本身已存储的凭据。

我认为这是一个 hack,因为只影响少数用户,所以它是一个 sdk bug。