【问题标题】:How do I access Firebase tokens outside of the FirebaseInstanceIdService?如何在 FirebaseInstanceIdService 之外访问 Firebase 令牌?
【发布时间】:2017-03-09 00:11:53
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    只是为了解释 方法 1 中发生了什么。建议在onTokenRefresh() 中获取token,因为当这个方法被触发时,意味着previous token 已经失效。来自文档:

    当系统确定令牌需要刷新时调用。应用程序应调用 getToken() 并将令牌发送到所有应用程序服务器。

    对于方法#2,您调用的是getToken(String authorizedEntity, String scope),而不是getToken()setting up your app to receive messages from multiple senders时常用的有两个参数。

    对于具有不同项目 ID (authorizedEntity) 的每次调用 getToken(String authorizedEntity, String scope),它将返回不同的令牌。

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

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

    并且您应该能够检索指定的令牌。令牌通常在您初始活动的onCreate() 中检索。

    【讨论】:

    • 知道了。如果我使用与 google-services.json 中指定的相同的 projectID,您是否知道为什么方法 #2 返回不同的令牌?如果他们使用相同的 ID,我会假设它们应该是相同的。
    • 文档中没有说明它是如何在内部工作的。我认为发生的情况是,由于getToken(String, String) 预计仅用于注册不同的发件人,它会自动将发件人 ID(无论它是默认的/或一个 google-services.json)视为不同的一。我希望这是有道理的。
    【解决方案2】:

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

    要在FirebaseInstanceIdService 类之外访问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();
    
    
        }
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-28
      • 2020-09-16
      • 2018-10-15
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 2014-10-29
      相关资源
      最近更新 更多