据我所知,如果发生以下情况之一,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 服务器无法知道设备的新令牌是什么(如果存在)。因此,当我向该设备发送通知/数据消息时,服务器无法将其发送到设备,因为它不知道将其发送到哪里(因为没有有效的令牌)。如何确保在这种情况下我可以通知设备?我不生成客户令牌。所以它似乎时不时地刷新令牌。如何提高令牌的有效性?
android firebase firebase-cloud-messaging google-cloud-firestore
因此,既然FirebaseInstanceIdService服务已被弃用,我不确定用什么替换它。
我以前在清单中声明了一个服务,如下所示:
<service
android:name=".fcm.FcmIdService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)
服务本身:
public class FcmIdService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
// Create notification channel.
createFcmNotificationChannel();
}
}
Run Code Online (Sandbox Code Playgroud)
如果删除该服务,我将不再收到通知,因此我假设我必须用其他东西代替它。
谢谢。
编辑:该问题与建议的重复问题有所不同,它还涵盖了对我仍然不清楚的受影响服务的清单声明。