调用FirebaseInstanceId.getToken

时间:2018-10-04 22:17:00

标签: android firebase firebase-cloud-messaging

我在FirebaseInstanceId.getToken(String authorizedEntity, String scope)周围有两种类型的问题,一种是多次调用此方法,另一种是是否调用此方法会触发FirebaseMessagingService.onNewToken(String token)

1)多次拨打: 根据此documentation,为了能够接收来自多个发件人的消息,将多次调用getToken(String authorizedEntity, String scope),每次使用不同的发件人ID。我的问题是,每个呼叫都将返回不同的令牌,还是每个呼叫都将返回相同的令牌,但是现在令牌也可用于多个发件人?如果我们使用以前使用过的发件人ID调用此方法,它将返回现有令牌还是生成新令牌?

所以,说我有这个操作顺序

  1. 致电getToken("senderId1", "FCM")并获得令牌A
  2. 致电getToken("senderId2", "FCM")。我会得到A还是其他令牌B
  3. 致电getToken("senderId2", "FCM")。我会得到AB还是其他C

2)会叫onNewToken吗? documentation声明如果令牌更改,则将调用该方法。因此,这是否意味着如果getToken返回的令牌与之前不同,那么onNewToken也将被调用?如果我们要多次调用getToken以便允许来自不同发件人的接收,并且每次调用都返回不同的令牌,则onNewToken将继续被调用。

由于建议我们在触发onNewToken时更新服务器,因此我想了解预期的行为,并避免一般性地在每次onNewToken调用时更新服务器。

2 个答案:

答案 0 :(得分:4)

  

我的问题是,每个呼叫将返回不同的令牌,还是每个呼叫将返回相同的令牌,但是现在令牌也可用于多个发件人?

getToken() / getToken(String, String)将返回相同的令牌,直到相应的令牌到期为止。请注意,同样的标记,是指它们为每个发送者返回的相同的标记。即:

  • getToken()返回默认项目的注册令牌(例如tokenDefaultSenderId)
  • getToken(String, String)返回与其关联的发件人的注册令牌(例如tokenSenderId2)
  

如果我们使用以前使用过的发件人ID调用此方法,会返回现有令牌还是生成新令牌?

  1. 好的。
  2. 您将获得令牌B
  3. 您将再次获得令牌B

令牌已绑定到与其关联的发件人。

  

会调用onNewToken吗? ...那么这是否意味着如果getToken返回的令牌与以前不同,那么onNewToken也将被调用?

onNewToken()仅返回默认发送者的令牌(重点是我的):

  

在为默认Firebase项目生成新令牌时调用。

关于onNewToken()的事情是,它仅在先前的令牌到期时才触发-要问的是,如果默认发件人的令牌到期了,其他发件人还有什么呢?因此,最好的解决方法是为您拥有的每个发件人调用getToken(),如下所示:

public void onNewToken(String token){
    String default = token;
    String sender2 = getToken("senderId2", "FCM");
    // and so on for each of your sender, then save the tokens as needed
}

答案 1 :(得分:0)

  • 每个发件人ID的令牌都是唯一的。不同的发送者ID具有不同的令牌。

  • 默认发件人是您google-services.json中定义的发件人(与应用连接到的Firebase项目相关)

  • 更改默认发件人的令牌时,将调用
  • OnNewToken 。更改特定发件人的令牌(默认值除外)时,不会触发任何回调。

  • 如@sNash所述,他联系了Firebase支持:

  

我联系了火力基地支持团队并得到了答案。答案摘要:Firebase云消息传递不会自动管理其他发件人ID的令牌。因此,开发人员应对其管理负责。你们必须使用自己的方法手动检查其有效性。

How to determine if token needs to be refreshed in case of multiple sender id?

管理特定发件人ID(默认值除外)的令牌

一种用于管理特定发件人ID(默认值除外)的令牌的简单解决方案是通过将所有发件人ID及其令牌存储在SharedPreferences或db中。应用启动时,通过将存储的令牌与的返回令牌进行比较,检查每个发送者的令牌是否更改

FirebaseInstanceId.getInstance().getToken(SENDER_ID, "FCM");

此外,在onNewToken方法中执行相同的检查。更改默认令牌后,有可能会更改默认令牌以外的其他令牌。