我从GCM升级到FCM。在onTokenRefresh之外获取Firebase设备令牌的正确方法是什么?
我试图获取设备令牌,以便稍后可以在我的服务器上重新启用它。我最初通过遵循方法1中显示的here文档来获取设备令牌。但是当我尝试通过方法2直接访问设备令牌时,我获得了不同的令牌。我是否在方法2中错误地检索设备令牌?
方法1:FirebaseInstanceIdService.onTokenRefresh()
内部String refreshedToken = FirebaseInstanceId.getInstance().getToken();
方法2:直接访问设备令牌
FirebaseInstanceId instanceID = FirebaseInstanceId.getInstance();
String registrationToken = instanceID.getToken(this.projectNumber, "FCM");
答案 0 :(得分:5)
只是为了解释方法1 中发生的事情。建议在onTokenRefresh()
内部获取令牌,因为当触发此方法时,这意味着上一个令牌失效。来自文档:
系统确定需要刷新令牌时调用。应用程序应调用getToken()并将令牌发送到所有应用程序服务器。
对于方法#2 ,您正在调用getToken(String authorizedEntity, String scope)
,而不是getToken()
。具有两个参数的那个通常在setting up your app to receive messages from multiple senders时使用。
对于使用不同项目ID(if( aInput[0].checked == false){
aTxt[0].value = aInput[0].value;
}
)的getToken(String authorizedEntity, String scope)
每次调用,它将返回不同的令牌。
只需将方法2 替换为方法1 中的相同调用,如下所示:
authorizedEntity
您应该能够检索指定的令牌。通常会在您初始活动的String registrationToken = FirebaseInstanceId.getInstance().getToken();
中检索令牌。
答案 1 :(得分:0)
对于任何寻求更好解决此问题的人,这就是我的解决方法。如果您的应用程序首次运行或您刚刚清除了应用程序数据,将会生成一个唯一令牌。
要访问token
类之外的FirebaseInstanceIdService
,请在onTokenRefresh
内使用SharedPreference并保存令牌,如下所示。
public class FireBaseTokenClass extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
SharedPreferences sharedPreferences = getSharedPreferences("file_save_token", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("myToken", refreshedToken);
editor.apply();
}
}
要在服务类之外访问令牌,只需说一遍:
SharedPreferences sharedPreferences = getSharedPreferences("file_save_token", Context.MODE_PRIVATE);
String token = sharedPreferences.getString("myToken", "");