如何访问FirebaseInstanceIdService之外的Firebase令牌?

时间:2017-03-09 00:11:53

标签: android firebase google-cloud-messaging firebase-cloud-messaging

我从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");

2 个答案:

答案 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", "");