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

4

我理解如果以下情况之一发生,FCM令牌会自动更新:

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

以下内容可用于应用程序端监视令牌更新。

监视令牌生成

每当生成新令牌时,onTokenRefresh回调函数被触发,因此在其上下文中调用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);
}

我的问题是,当应用程序被终止时,令牌过期并且FCM服务器无法知道设备的新令牌(如果有)。因此,当我向该设备发送通知/数据消息时,服务器无法将其发送到设备,因为它不知道要发送到哪里(因为没有有效令牌)。我如何确保在这种情况下可以通知设备?我不进行自定义令牌生成。所以似乎现在和然后刷新令牌。我如何增加我的令牌的有效性?
1个回答

5
你需要在发送消息时检查错误,并注意错误代码,如文档中所列示。如果出现错误代码为 messaging/registration-token-not-registered,则应停止使用该令牌。请参考文档

2
是的,如果我遇到这个错误,我不会尝试发送消息。我的问题是如何确保我能将消息传递到带有过期令牌的设备?一个简单的用例是当您想通知用户某些内容,比如新的优惠或交易,促使用户打开应用程序时。在这种情况下,应用程序已经长时间终止了。由于服务器不知道正确的令牌,我该如何联系到用户? - vzurd
2
你不能这样做 - 它已经过期了。你需要在你的应用程序中安排发送刷新令牌到后端并使用它。如果你尽快安排这个,你应该在旧令牌失效之前就有了新的令牌。最佳实践是在每次应用程序启动时发送它,以防万一。 - Doug Stevenson
1
同意。如果应用程序长时间未启动(可能是因为用户不经常使用它),那么应用程序就没有机会刷新令牌到后端。在这种情况下,从服务器端是否有其他方法找到正确的令牌? - vzurd
1
我不知道。记住,如果用户没有积极使用您的应用程序,则可能不希望您远程调用它。 - Doug Stevenson
1
我只使用了一天左右的 FCM,但我仍在玩昨天得到的一个令牌,时间比30分钟之前还要长。我在这里看到一些答案说这些令牌不会过期:https://dev59.com/JlgQ5IYBdhLWcg3w7ojY - Dmitry Minkovsky
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接