firebase的app token在什么时期发生变化,如何管理?

In what period does the firebase's app token changes and how to manage it?

我是 firebase 的新手,我像学走路的小孩一样学习它。到目前为止,我已经成功地使用 firebase 框架为我的 phone 生成的令牌向我自己的 phone 发送了一条消息。现在这里是棘手的地方(在我看来)。 FirebaseInstanceIdService 扩展服务中有一个名为onTokenRefresh() 的方法。既然叫refresh,那么我假设它会改变。我想知道这个令牌是什么时候创建的,什么时候会更改?

如果它发生变化,假设我向带有令牌 'A' 的设备发送一条消息,该设备目前处于离线状态,因此它将排队。现在,当设备上线时,它将 "refresh" 令牌发送到 'B'。现在,由于消息应该传递给令牌 'A',因此该消息将永远不会传递。我该如何处理这种情况?

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

正如您所指出的,令牌可以更改,在这种情况下,将再次调用 onTokenRefresh() 方法。
刷新事件很少见,不要指望经常看到。

刷新令牌发生时,所有已 "successfully" 发送(API 返回给您的消息 ID)到旧令牌的消息都将被传送。

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

在您的应用程序初始启动时,FCM 的 sdk 会为客户端应用程序实例生成注册令牌。如上所述,这是一个罕见的事件。具体来说,注册令牌可能会在以下时间发生变化:

  • 应用程序删除了实例 ID。
  • 该应用已在新设备上恢复
  • 用户uninstall/reinstall应用程序
  • 用户清除应用数据。

实例 ID 为您的每个实例提供一个唯一的 ID apps.Instance ID 提供一个简单的 API 来生成安全令牌,授权第三方访问您应用的服务器端托管 resources.The 实例ID 服务器甚至可以告诉您安装您的应用程序的设备最后一次安装的时间 used.We 可以使用它来决定是从应用程序中保留数据还是发送推送消息以重新吸引用户。

每次device token变化,体现在onTokenRefresh() method.For变化时获取device token,我们可以调用这个方法来获取刷新的令牌。

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

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

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

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

令牌什么时候可以更改?

  • 应用程序删除实例 ID
  • 应用在新设备上恢复
  • 用户uninstalls/reinstall应用程序
  • 用户清除应用数据

如何获取当前令牌:

通过调用 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 除外)的令牌, 检查