我的应用程序正在接收来自 2 个 Firebase 项目的推送通知。我通过分别调用"getToken(字符串授权实体,字符串范围("来获取每个发件人 ID 的令牌。
String token1 = FirebaseInstanceId.getInstance().getToken("authorizedEntity1", "FCM");
String token2 = FirebaseInstanceId.getInstance().getToken("authorizedEntity2", "FCM");
根据onTokenRefresh文档
当系统确定令牌需要刷新时调用。应用程序应调用 getToken(( 并将令牌发送到所有应用程序服务器。这不会经常调用,它是密钥轮换和处理实例 ID 更改所必需的,因为:
应用删除实例 ID
应用已在新设备上恢复
用户卸载/重新安装应用
用户清除应用数据
由于onTokenRefresh已被弃用,我已经检查了onNewToken,根据文档
在为默认 Firebase 项目生成新令牌时调用。 在应用安装后首次生成令牌时调用此值,如果令牌发生更改,则再次调用此值。
问题 1.在有多个发件人 ID 的情况下,如何知道哪个是默认的 Firebase 项目?
问题 2.假设如果"authorizedEntity1"与默认的Firebase项目相关联,那么这是否意味着只有在令牌1被更改时才调用onNewToken?或者当令牌 2 被更改时也会调用它?如果它不适用于令牌 2,那么如何知道令牌 2需要刷新?
问题 3.参考这一点,我的理解是每当需要刷新任何令牌时,都会调用 onTokenRefresh(不仅对于默认项目(。这种理解正确吗?
每当系统确定需要刷新令牌1或令牌2时,我想将更新的令牌发送到服务器。
注意:我正在应用程序类中初始化 firebase,因为我正在处理多个发件人 ID。
经过一些测试,我发现只有默认项目的令牌才会被传送到 onNewToken。 当通过调用 getToken 为其他发件人 ID 创建新令牌时,不会调用 onNewToken。
通过调用 getToken API 检索的令牌由与默认令牌不同的字符串数据组成。
当默认令牌更改时,这些其他发件人 ID 的令牌不会刷新。 看起来它们会持续到您显式调用 deleteToken API 为止。 (当我反复调用 getToken 时,令牌值没有改变。
根据与Firebase 支持团队联系@sNash评论,您应该管理除默认发件人 ID 之外的所有发件人 ID 的令牌。
如何? 一个简单的解决方案是将所有发件人 ID 及其令牌存储在 SharedPreferences 或数据库中。应用启动时,通过将存储的令牌与 返回的令牌进行比较,检查每个发件人的令牌是否已更改
FirebaseInstanceId.getInstance().getToken(SENDER_ID, "FCM");
此外,在NewToken方法上执行相同的检查。更改默认令牌时,可能会更改默认令牌以外的令牌。
默认发件人是与应用连接到的Firebase项目相关的发件人,可以在google-services.json中找到。