我正在使用Firebase数据库服务来同步用户数据。 我启用了离线兼容性,问题是在使用几个月后,用户数据显然没有提交到在线数据库,因为用户电话系统阻止了应用程序的互联网连接。
在某些情况下,我设法指导用户启用"无限数据使用"选项,但并不适合所有人。
就我而言,问题在于听众:
void onDataChange(DataSnapshot var1);
来自ValueEventListener
的在大量数据脱机存储且未提交时不会被触发,并且阻止所有行为。
我没有在线存储限制,因为我有Blaze
计划(支付费用)。
交易也没有提交,并且触发"交易被后续集合覆盖了#34;错误代码为-9。
Firebase提供的The Connection detector始终打印"未连接"
我还尝试将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 ]
当我尝试插入新数据时:
RepoOperation: Aborting transactions for path: [the path]
答案 0 :(得分: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();
}
2)然后我检查数据库是否连接到: Detecting Connection State
如果应用程序有互联网连接并且数据库未连接,那么我尝试刷新令牌:
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错误。