我在FirebaseInstanceId.getToken(String authorizedEntity, String scope)
周围有两种类型的问题,一种是多次调用此方法,另一种是是否调用此方法会触发FirebaseMessagingService.onNewToken(String token)
。
1)多次拨打:
根据此documentation,为了能够接收来自多个发件人的消息,将多次调用getToken(String authorizedEntity, String scope)
,每次使用不同的发件人ID。我的问题是,每个呼叫都将返回不同的令牌,还是每个呼叫都将返回相同的令牌,但是现在令牌也可用于多个发件人?如果我们使用以前使用过的发件人ID调用此方法,它将返回现有令牌还是生成新令牌?
所以,说我有这个操作顺序
getToken("senderId1", "FCM")
并获得令牌A
getToken("senderId2", "FCM")
。我会得到A
还是其他令牌B
?getToken("senderId2", "FCM")
。我会得到A
,B
还是其他C
? 2)会叫onNewToken
吗?
documentation声明如果令牌更改,则将调用该方法。因此,这是否意味着如果getToken
返回的令牌与之前不同,那么onNewToken
也将被调用?如果我们要多次调用getToken
以便允许来自不同发件人的接收,并且每次调用都返回不同的令牌,则onNewToken
将继续被调用。
由于建议我们在触发onNewToken
时更新服务器,因此我想了解预期的行为,并避免一般性地在每次onNewToken
调用时更新服务器。
答案 0 :(得分:4)
我的问题是,每个呼叫将返回不同的令牌,还是每个呼叫将返回相同的令牌,但是现在令牌也可用于多个发件人?
getToken()
/ getToken(String, String)
将返回相同的令牌,直到相应的令牌到期为止。请注意,同样的标记,是指它们为每个发送者返回的相同的标记。即:
getToken()
返回默认项目的注册令牌(例如tokenDefaultSenderId)getToken(String, String)
返回与其关联的发件人的注册令牌(例如tokenSenderId2)如果我们使用以前使用过的发件人ID调用此方法,会返回现有令牌还是生成新令牌?
B
。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方法中执行相同的检查。更改默认令牌后,有可能会更改默认令牌以外的其他令牌。