Firebase生成新令牌后不发送通知

时间:2019-10-26 15:35:57

标签: android firebase push-notification firebase-cloud-messaging

我正在使用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文档中描述的所有步骤。

1 个答案:

答案 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答案

此外,根据实际情况,无需删除要注销的令牌。只需退订或在注销时禁用即可。您可以在下次登录时将令牌重新分配给新用户或旧用户。