【问题标题】:Firebase doesn't send notification after generating new token生成新令牌后 Firebase 不发送通知
【发布时间】:2019-10-26 15:35:57
【问题描述】:

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

【问题讨论】:

  • 请分享您从 firebase 发送的消息正文。
  • I can't receive notification from firebase 来自 Firebase 控制台?从你的服务器?您是否将新令牌发送到您的服务器?当您的应用在前台时,您会处理 FCM 吗?
  • 来自服务器。是的,我已将新令牌发送到我的服务器。是的,我已经为前台处理了 FCM,并且我已经测试了一个带有调试断点的应用程序,onMessageReceived 没有被调用。 @EugenPechanec
  • @MayuriKhinvasara 我正在从服务器发送消息
  • 请参阅此答案 (stackoverflow.com/a/58587480/1300813) 以了解服务器端消息的正确格式。

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


【解决方案1】:

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);

你也可以通过manifest文件设置

  <meta-data android:name="firebase_messaging_auto_init_enabled"
             android:value="false" />

还要确保, (1) 您正在以正确的格式(数据或通知类型)发送消息正文并处理正确的前台/后台状态。 (2) 您正在发送正确的代币。 (3) 从服务器以正确的格式(数据或通知负载)发送消息。从 android 客户端以正确的格式接收它。参考this答案

此外,作为实践问题,无需删除用于注销的令牌。只需在注销时取消订阅或禁用。您可以在下次登录时将令牌重新分配给新用户或旧用户。

【讨论】:

  • 它在后台,抱歉我忘记添加了。
  • 请分享您从 firebase 仪表板或 api 发送的消息正文
  • "alert" 这是我从我的 api 发送的消息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多