Firebase 云消息传递 onMessageReceived 未触发

Posted

技术标签:

【中文标题】Firebase 云消息传递 onMessageReceived 未触发【英文标题】:Firebase Cloud Messaging onMessageReceived not getting triggered 【发布时间】:2016-10-09 05:34:12 【问题描述】:

按照 Firebase dev docs 中的说明,我实现了一个扩展 FirebaseMessagingService 并覆盖 onMessageReceived 回调的服务。我在 onMessageReceived 方法的第一行中放置了一条日志消息。

应用在后台运行 我在 logcat 中看不到日志,但我看到系统尝试中发布了一条通知。

前台应用 我在系统托盘中既没有看到日志也没有看到通知

知道发生了什么吗?

清单

   <service
        android:name=".fcm.MovieMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>

服务类

public class MovieMessagingService extends FirebaseMessagingService 

    private static final String LOG_TAG = MovieMessagingService.class.getSimpleName();

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) 


        Log.d(LOG_TAG, "From: " + remoteMessage.getFrom());

    

    /**
     * Create and show a simple notification containing the received FCM message.
     *
     * @param messageBody FCM message body received.
     */
    private void sendNotification(String messageBody) 
        Log.d(LOG_TAG, "Presenting Notification with message body: " + messageBody);
//more code
    

【问题讨论】:

将您的服务类代码和清单代码添加到问题中 是服务的正确路径(包名) 是的,否则应用程序甚至无法编译。如您所见,我在清单中使用相对路径-“.fcm.MovieMessagingService” 你如何将消息发送到设备? 来自 Firebase 控制台。 console.firebase.google.com -> 通知->新消息 【参考方案1】:

这是一个如何接收消息以及如何处理不同类型的代码示例。这是代码的source。

public class MyFirebaseMessagingService extends FirebaseMessagingService 

private static final String TAG = "MyFirebaseMsgService";

/**
 * Called when message is received.
 *
 * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
 */
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) 
    // [START_EXCLUDE]
    // There are two types of messages data messages and notification messages. Data messages are handled
    // here in onMessageReceived whether the app is in the foreground or background. Data messages are the type
    // traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app
    // is in the foreground. When the app is in the background an automatically generated notification is displayed.
    // When the user taps on the notification they are returned to the app. Messages containing both notification
    // and data payloads are treated as notification messages. The Firebase console always sends notification
    // messages. For more see: https://firebase.google.com/docs/cloud-messaging/concept-options
    // [END_EXCLUDE]

    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) 
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());
    

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) 
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    


【讨论】:

【参考方案2】:

实际上,应用程序在接收包括通知和数据负载在内的消息时的行为取决于应用程序是在后台还是前台,例如:

在后台时,应用在通知托盘中接收通知负载,并且仅在用户点击通知时处理数据负载。

在前台时,您的应用会收到一个带有两个有效负载的消息对象。

所以,摘要是当应用程序处于后台时,您可以在系统托盘中看到通知,并且在点击通知之前看不到任何日志,但您只会看到打开活动日志而不是服务日志因为它已经执行了。

当应用程序在前台时,您可以在 logcat 中看到日志,但在系统托盘中看不到任何通知,因为您的应用程序已经打开状态,您将只收到数据负载。

【讨论】:

2 年及以上。当我同时发送通知和数据负载时,我的应用程序(在前台运行)没有收到 onMessageReceived 回调 点击通知,然后打开您的应用。如果您正确完成了代码部分,则应该调用 onMessageReceived。 应用程序在前台,因此没有通知。令人惊讶的是,如果我从 Firebase 作曲家发送带有通知和数据有效负载的消息,它就可以工作。

以上是关于Firebase 云消息传递 onMessageReceived 未触发的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 和 FCM(Firebase 云消息传递)onMessage、onResume 和 onLaunch 在单击通知时未触发(包:firebase_messaging 7.0.0)

Firebase 消息传递 onMessage 仅在窗口中可用

Flutter - Firebase 云消息传递,iOS 上未收到数据消息

FCM(Firebase 云消息传递):Firebase 推送通知在 Firefox 中显示,但在 Chrome 中不显示

FirebaseMessaging.onMessage.listen() 仅适用于通知消息

应用关闭时,Firebase消息传递无法接收通知(React Native)