我们的业务逻辑要求我们在运行时实例化Firebase。在知道用户的公钥后,我们从默认的Firebase位置获取Firebase凭据(应用ID,API密钥等),并使用这些凭据创建Firebase实例。
这意味着应用中有两个Firebase实例:
第二个Firebase初始化如下:
FirebaseApp app = FirebaseApp.initializeApp(<context>, <options>, <app_label>);
我们的问题是,使用FirebaseInstanceIdService
和onTokenRefresh()
检索FCM令牌的传统方法失败,因为onTokenRefresh()
方法仅由第一个调用Firebase实例。
直接调用String token = FirebaseInstanceId.getInstance(app).getToken();
会返回null,因为它在调用时从未就绪。我们甚至尝试轮询这个以测试是否在某个时刻生成了令牌。没有运气。
如何从运行时实例化的Firebase实例中可靠地生成FCM令牌?
答案 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实例。