firebase的app令牌在什么时间段内发生变化以及如何管理它?

时间:2016-06-07 11:33:45

标签: android push-notification firebase firebase-cloud-messaging

我是firebase的新手我正在学习它,就像一个学习走路的小孩。到目前为止,我已经设法使用firebase框架为我的手机生成的令牌向我自己的手机发送消息。现在这里变得棘手(在我看来)。 onTokenRefresh()扩展服务中有一个名为FirebaseInstanceIdService的方法。因为它被称为刷新,所以我假设它会改变。我想知道何时创建此令牌以及何时更改它?

如果它发生变化,假设我向一个带有令牌的设备发送消息' A'现在离线,所以它将排队。现在当设备上线时,它将刷新"令牌为' B'。现在,由于消息应该传递给令牌“A'”,因此永远不会传递消息。我该如何处理这种情况?

3 个答案:

答案 0 :(得分:52)

只要手机可以连接到Google服务器,就会在应用首次启动后生成令牌。由于所需的连接性,这可能不会立即发生,但在大多数情况下,它将在用户打开应用程序后的几秒钟内发生。 一旦生成令牌,就会调用方法onTokenRefresh()

正如您所指出的那样,令牌可以改变,在这种情况下,将再次调用onTokenRefresh()方法 刷新事件在某种程度上是罕见的,不要指望经常看到它。

当刷新令牌发生时,所有已“成功”发送的消息(API将消息ID返回给旧令牌)将被传递。

最后,即使在刷新发生后,旧令牌仍然会在短时间内工作,以允许应用程序将新令牌传送到其后端。

答案 1 :(得分:22)

在应用程序首次启动时,FCM的sdk会为客户端应用程序实例生成注册令牌。如上所述,这是一个罕见的事件。具体而言,注册令牌可能会在以下时间更改:

  • 该应用删除实例ID。
  • 该应用已在新设备上恢复
  • 用户卸载/重新安装应用
  • 用户清除应用数据。

实例ID为您的app的每个实例提供唯一ID .Instance ID提供了一个简单的API来生成安全令牌,授权第三方访问您应用的服务器端托管资源。实例ID服务器甚至可以告诉您设备何时开启您的应用程序安装的最后一次使用。我们可以使用它来决定是从应用程序保留数据还是发送推送消息以重新与用户互动。

每次更改设备令牌时,都会反映在 onTokenRefresh()方法中。为了在设备令牌更改时获取设备令牌,我们可以调用此方法获取刷新令牌。

并且要随时获取设备令牌,我们可以使用 FirebaseInstanceId.getInstance()。getToken()方法获取当前设备令牌。获取设备令牌需要一些时间

单击here以阅读有关访问设备注册令牌的更多信息。

答案 2 :(得分:1)

  • onTokenRefresh() FirebaseInstanceIdService 已弃用。
  • 此调用也已弃用 FirebaseInstanceId.getInstance()。getToken()

相反,您应该在 FirebaseMessagingService 中覆盖 onNewToken(String token)。令牌更改时触发此方法。重写此方法后,可以安全删除包含onTokenRefresh()的FirebaseInstanceIdService。

令牌何时可以更改?

  • 应用删除实例ID
  • 应用已在新设备上还原
  • 用户卸载/重新安装应用程序
  • 用户清除应用数据

如何获取当前令牌:

通过调用FirebaseInstanceId.getInstance()。getInstanceId():

FirebaseInstanceId.getInstance().getInstanceId()
    .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
        @Override
        public void onComplete(@NonNull Task<InstanceIdResult> task) {
            if (!task.isSuccessful()) {
                Log.w(TAG, "getInstanceId failed", task.getException());
                return;
            }

            // Get new Instance ID token
            String token = task.getResult().getToken();

            // Log and toast
            String msg = getString(R.string.msg_token_fmt, token);
            Log.d(TAG, msg);
            Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

有关更多信息: https://firebase.google.com/docs/cloud-messaging/android/client

对于管理特定发件人ID(默认发件人ID除外)的令牌,  检查here