当存在多个发送者ID时,如何确定令牌是否需要刷新?

5

我的应用程序从2个Firebase项目接收推送通知。我通过分别调用“getToken(String authorizedEntity,String scope)”获取每个发送者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 项目相关联,则这是否意味着只有在更改 token1 时才会调用 onNewToken?还是当更改 token2 时也会调用?如果不适用于token2,则如何知道需要刷新token2问题 3:参考这里,我的理解是当任何令牌需要刷新时都会调用 onTokenRefresh(不仅适用于默认项目)。这个理解正确吗?
我希望在系统确定需要刷新token1token2时将更新的令牌发送到服务器。 注:由于我正在处理多个发送方 ID,因此我在应用程序类中初始化 firebase。

嘿,你找到解决方案了吗?我也遇到了类似的问题,而谷歌的文档并不清晰。 - Liuting
2个回答

2

经过一些测试,我发现只有默认项目的令牌才会传递到onNewToken。当通过调用getToken为其他发送者ID创建新令牌时,onNewToken不会被调用。

通过调用getToken API检索的令牌由与默认令牌不同的字符串数据组成。

这些其他发送者ID的令牌在默认令牌更改时不会刷新。它们似乎会一直保留,直到您显式调用deleteToken API。(当我反复调用getToken时,令牌值没有改变。)


@sNash,我想处理令牌过期/刷新场景。我知道默认项目的令牌将在onNewToken中提供。我有多个发送者ID。在接收到onNewToken回调后,我会为每个发送者ID调用“String getToken(String authorizedEntity,String scope)”并将其发送到服务器(避免在onNewToken上交付令牌)。我的理解是:只要默认令牌或其他令牌安全性已被破坏并且系统确定需要刷新令牌,应用程序将获得onNewToken回调。这个理解正确吗? - Hey You
@HeyYou 当以下事件之一发生时,令牌刷新将会被执行。
  • 应用程序删除实例 ID
  • 应用程序在新设备上恢复
  • 用户卸载/重新安装应用程序
  • 用户清除应用程序数据 当 onNewToken 被调用时,我会通过调用 getToken 来检查额外的发送者 ID 的令牌。
- sNash
@sNash,根据您的回复“onNewToken仅适用于默认发件人ID。默认发件人ID意味着它使用google-service.json获取fcm令牌。因此,对于其他发件人ID的令牌刷新,将不会调用onNewToken。” 有任何想法如何处理应用程序将知道或获取回调时其他发件人ID的令牌需要刷新? - Hey You
@HeyYou,正如你在上面的评论中提到的那样,我现在也在做同样的事情:“在onNewToken回调中,我为每个发送者调用“String getToken(String authorizedEntity,String scope)”。但是,由于文档不清楚,我建议你联系Firebase支持(步骤3在这里)。 - garnet
2
@garnet 我联系了Firebase支持团队并得到了答案。 答案摘要:Firebase云消息传递不会自动管理不同发送者ID的令牌。因此,开发人员需要负责管理它。您必须使用自己的方法手动检查其有效性。 - sNash
显示剩余4条评论

1
根据 @sNash 的评论,他联系了 Firebase 支持团队,你需要管理除默认发送者 ID 以外的所有发送者 ID 的令牌。
如何做到呢? 一个简单的解决方案是通过将所有发送者 ID 与其令牌存储在 SharedPreferences 或数据库中。当应用程序启动时,通过比较存储的令牌和返回的令牌来检查每个发送者的令牌是否更改。
FirebaseInstanceId.getInstance().getToken(SENDER_ID, "FCM");

此外,在onNewToken方法中进行相同的检查。当默认令牌更改时,可能会更改除默认令牌之外的令牌。
默认发送方是与您的Firebase项目相关联的发送方,并且可以在google-services.json文件中找到。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接