Firebase 云消息传递:FCM 令牌过期

vzu*_*urd 4 android firebase firebase-cloud-messaging google-cloud-firestore

据我所知,如果发生以下情况之一,FCM 令牌会自行更新。

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

App端可以使用以下方法来监控Token更新。

监控代币生成

每当生成新令牌时都会触发 onTokenRefreshcallback,因此在其上下文中调用 getToken 可确保您正在访问当前可用的注册令牌。确保您已将服务添加到清单中,然后在 onTokenRefresh 的上下文中调用 getToken,并记录值,如下所示:

@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // Instance ID token to your app server.
    sendRegistrationToServer(refreshedToken);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,当应用程序终止时,令牌就会过期,并且 FCM 服务器无法知道设备的新令牌是什么(如果存在)。因此,当我向该设备发送通知/数据消息时,服务器无法将其发送到设备,因为它不知道将其发送到哪里(因为没有有效的令牌)。如何确保在这种情况下我可以通知设备?我不生成客户令牌。所以它似乎时不时地刷新令牌。如何提高令牌的有效性?

Dou*_*son 5

您需要在发送消息时检查是否有错误,并注意文档中列出的错误代码。如果出现错误,您应该停止使用该令牌messaging/registration-token-not-registered

  • 是的,如果出现此错误,我不会尝试发送消息。我的问题是如何确保使用过期令牌将消息传递到设备?一个简单的用例是当您想要通知用户某件事(例如新优惠或交易)时,提示用户打开应用程序。在这种情况下,该应用程序被终止很长时间。由于服务器不知道正确的令牌,我如何联系用户? (2认同)
  • 你不能——它已经过期了。您必须在应用程序中安排将刷新的令牌发送到后端并使用它。如果您安排尽快发生,您应该在旧令牌失效之前拥有它。最佳做法是在每次应用程序启动时发送它,以防万一。 (2认同)