Firebase数据库未提交联机数据阻止侦听器



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

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

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

void onDataChange(DataSnapshot var1);

来自ValueEventListener的,在大量数据离线存储且未提交时不会被触发,并阻止所有行为。

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

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

Firebase提供的连接检测器总是打印"未连接">

我还试着用goOnline()替换goOffline(),但什么也没发生。

我不明白为什么手机会阻止我的应用程序同步,并让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 ]

当我尝试插入新数据时:

RepoOperation: Aborting transactions for path: [the path]

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

首先,检查当前用户是否使用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();
}

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
}

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

我认为这是一个黑客攻击,因为它只影响少数用户,所以它是一个sdk错误。

最新更新