我正在使用Firebase接收推送通知。我在第一次安装时获得FCM令牌。注销该应用程序后,我将删除FCM令牌,并在下次登录时生成一个新令牌。
一切正常,firebase为我提供了一个新令牌。但我仍然无法收到来自Firebase的通知。
以下是我正在使用的代码。
删除令牌
FirebaseInstanceId.getInstance().deleteInstanceId();
生成新令牌
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
token=instanceIdResult.getToken();
}
});
AndroidManifest.xml
<service
android:name="FirebaseMessaging.EDOFirebaseService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
请帮助我找出问题所在。我正在执行Firebase文档中描述的所有步骤。
答案 0 :(得分:0)
documentation声明'deleteInstanceId'是一个阻塞函数,不应在主线程上调用它。 您可以在后台线程上调用它,并在完成后生成一个新令牌。
public void logoutFromFCM() {
// Disable auto initilization
FirebaseMessaging.getInstance().setAutoInitEnabled(false);
//Delete instance
new Thread(() -> {
try {
FirebaseInstanceId.getInstance().deleteInstanceId();
//TODO Generate new token after this
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
您还可以为自动初始化设置正确的状态
FirebaseMessaging.getInstance().setAutoInitEnabled(false);
您也可以通过清单文件进行设置
<meta-data android:name="firebase_messaging_auto_init_enabled"
android:value="false" />
还要确保, (1)您正在以正确的格式(数据或通知类型)发送味精正文,并正在处理正确的前景/背景状态。 (2)您正在发送正确的令牌。 (3)从服务器以正确的格式(数据或通知有效负载)发送味精。从android客户端以正确的格式接收它。请参阅this答案
此外,根据实际情况,无需删除要注销的令牌。只需退订或在注销时禁用即可。您可以在下次登录时将令牌重新分配给新用户或旧用户。