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

How do I access Firebase tokens outside of the FirebaseInstanceIdService?

我正在从 GCM 升级到 FCM。在 onTokenRefresh 之外获取 Firebase 设备令牌的正确方法是什么?

我正在尝试获取设备令牌,以便稍后可以在我的服务器上重新启用它。我最初是按照方法 1 here 显示的文档获取设备令牌的。但是,当我尝试通过方法 2 直接访问设备令牌时,我得到了一个不同的令牌。我在方法 2 中是否错误地检索了设备令牌?

方法一:在FirebaseInstanceIdService.onTokenRefresh()

里面
String refreshedToken = FirebaseInstanceId.getInstance().getToken();

方法二:直接获取设备令牌

FirebaseInstanceId instanceID = FirebaseInstanceId.getInstance();
String registrationToken = instanceID.getToken(this.projectNumber, "FCM");

只是为了解释方法 1 中发生的事情。建议在 onTokenRefresh() 中获取令牌,因为触发此方法时,意味着 previous 令牌已失效。来自文档:

Called when the system determines that the tokens need to be refreshed. The application should call getToken() and send the tokens to all application servers.

对于方法 #2,您正在调用 getToken(String authorizedEntity, String scope), instead of getToken(). The one with two parameters is commonly used when

每次使用不同的项目 ID (authorizedEntity) 调用 getToken(String authorizedEntity, String scope),它都会 return 一个不同的令牌。

只需将您的方法 2 替换为 方法 1 中的相同调用,如下所示:

String registrationToken = FirebaseInstanceId.getInstance().getToken();

并且您应该能够检索到指定的令牌。令牌通常在您初始 activity.

onCreate() 中检索

对于正在寻找此问题更好解决方案的任何人,这就是我的处理方式。如果您的应用程序是第一次运行或者您刚刚清除了应用程序数据,将会生成一个唯一的令牌。

要在 FirebaseInstanceIdService class 之外访问 token,请使用 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();


    }
}

要在服务 class 之外访问您的令牌,只需这样说:

SharedPreferences sharedPreferences = getSharedPreferences("file_save_token", Context.MODE_PRIVATE); 
    String token = sharedPreferences.getString("myToken", "");