FirebaseInstanceId.getInstance()。getToken()为空

时间:2018-03-14 19:54:13

标签: android firebase firebase-cloud-messaging

getToken()使用令牌ID返回的正确,实体方法是什么?

我已经看过几次使用

的尝试
  • while-loop,调用getToken()直到它不为空
  • 本地BroadcastReceiver
  • 定时器

对于ANR而言,while循环似乎确实风险并且无限期地循环运行。

本地BroadcastReceiver不适用于我的应用程序,因为即使我的应用程序中存在主要活动,也没有任何强制用户与其进行交互。用户可以在应用程序中完成任务,而无需通过该主要活动。

计时器似乎很脆弱。你需要等多久?秒,分钟,小时?

Firebase快速入门示例代码没有提供一个示例来处理getToken()为空时的情况,并且我没有看到什么是正确且可靠的实现以确保返回令牌,没有任何上述实施的令人讨厌的副作用会带来。

使用回调方法挂钩会使这成为一个非问题,但由于这不可用,我只需要通过StackOverflow运行它来了解人们如何解决这个问题。

注意:我已实施onTokenRefresh()并且适用于文档中所述的特定情况,但我不能单独使用 ,因为该应用仅升级在很多设备上,并且在应用升级期间不会调用此方法。我在(Nexus)硬件设备上有空问题,我根本不使用模拟器,也不打算使用它。

1 个答案:

答案 0 :(得分:0)

由于似乎没有人添加其他方法,而不是我之前提到过的方法,我现在要回答我自己的问题。

"解决方案"我已经实现了生成令牌以便您可以更一致地处理它,并将其存储以供以后参考,是这样的;

以下课程紧随着快速入门。但是,不是将令牌发送到服务器,而是在可访问的确切时间,我将其存储起来供以后使用:

public class FirebaseIdService extends FirebaseInstanceIdService {

@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    if(refreshedToken != null) {
        Log.d("TOKENTAG", "Refreshed token: " + refreshedToken);
        SharedPreferences prefs = getApplicationContext().getSharedPreferences("pref_id", 0);
        prefs.edit().putString("share_pref_token", refreshedToken).apply();
    }
}

}

当我想/需要发送令牌时,我会检查SharedPreferences中是否已有可用的令牌,如果没有,我只需删除Firebase实例,然后调用getToken(),生成另一个。这基本上做的是告诉Firebase"我想使当前实例无效#34;然后,通过之后调用getToken(),让它生成一个新实例,实质上是onTokenRefresh()只要生成令牌 并且可用,就可以调用:

SharedPreferences prefs = getApplicationContext().getSharedPreferences("pref_id", 0);
if(prefs.getString("share_pref_token", "").isEmpty()) {
    Log.d("TOKENTAG", "token not available, so let's force one to be generated");
    try {
        FirebaseInstanceId.getInstance().deleteInstanceId();
    } catch (IOException e) {
        e.printStackTrace();
    }
    FirebaseInstanceId.getInstance().getToken();
}

我很确定这是一个次优解决方案,我欢迎提出更好的建议,但在这一点上,这基本上是唯一可以涵盖组合基础的方法{{1} }和onTokenRefresh()更加一致地获得一个令牌而没有任何前面提到的缺点。