无法从动态实例化的Firebase生成FCM令牌

时间:2017-04-07 04:58:47

标签: android firebase google-cloud-messaging firebase-cloud-messaging

我们的业务逻辑要求我们在运行时实例化Firebase。在知道用户的公钥后,我们从默认的Firebase位置获取Firebase凭据(应用ID,API密钥等),并使用这些凭据创建Firebase实例。

这意味着应用中有两个Firebase实例:

  1. 默认的“索引”Firebase,它为我们提供了凭据 第二
  2. 我们打算从那一点开始使用的实际Firebase     向前
  3. 第二个Firebase初始化如下:

    FirebaseApp app = FirebaseApp.initializeApp(<context>, <options>, <app_label>);
    

    我们的问题是,使用FirebaseInstanceIdServiceonTokenRefresh()检索FCM令牌的传统方法失败,因为onTokenRefresh()方法仅由第一个调用Firebase实例。

    直接调用String token = FirebaseInstanceId.getInstance(app).getToken();会返回null,因为它在调用时从未就绪。我们甚至尝试轮询这个以测试是否在某个时刻生成了令牌。没有运气。

    如何从运行时实例化的Firebase实例中可靠地生成FCM令牌?

1 个答案:

答案 0 :(得分:1)

通常,只有获取令牌(getToken())的传统方法才是引用主Firebase实例的唯一方法。这几乎可以在应用程序的任何位置调用(但通常在初始活动中调用)。这将返回与 google-services.json 中显示的发件人ID相关联的令牌。如果仍然生成令牌,则还可以返回null 。在这种情况下,onTokenRefresh()会在生成时触发。

但是,如果您打算为其他Firebase项目生成FCM注册令牌,则必须使用FirebaseIntsanceId.getInstance.getToken(String authorizedEntity, String scope),其中authorizedEntity不同的发件人ID < / em> Firebase项目和scope是“FCM”(您可以使用FirebaseMessaging.INSTANCE_ID_SCOPE作为默认值)。

简而言之,您无需在生成令牌时指定Firebase实例。

另请参阅我的回答herehere