Firebase onMessageReceived未调用

use*_*041 7 android firebase firebase-cloud-messaging

FCM服务:

public class FCMService extends FirebaseMessagingService {


    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {


        Log.i(Constants.TAG,"onMessageReceived");

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

        if (remoteMessage.getData().size() > 0) {
            Log.d(Constants.TAG, "Message data payload: " + remoteMessage.getData());
        }


        if (remoteMessage.getNotification() != null) {
            Log.d(Constants.TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
        }


    }

}
Run Code Online (Sandbox Code Playgroud)

App Gradle:

  compile 'com.google.firebase:firebase-messaging:10.2.6'
Run Code Online (Sandbox Code Playgroud)

表现:

   <service android:name="communications.FCMService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
    </service>
Run Code Online (Sandbox Code Playgroud)

- 我从FCM控制台发送消息但没有到达.发送消息时,FCM控制台显示确定.

-I从java服务器发送消息,消息不到.发送消息时,Java服务器显示OK.

- 发送消息我在Android设备中使用生成的令牌.

- 之前,我错误地导入FCM库,错误已解决.每次发送邮件时发生过去的错误,Android上都会发生异常.现在什么也没收到.

- 我在Android设备上有一个Internet连接,我通过GCM(而不是FCM)从我过去实现的另一个应用程序接收消息.

-App在前台.

有些日志使用"fcm"过滤器.我发送消息时会收到此日志.

08-14 12:09:25.640 800-4739/? D/PowerManagerService: acquireWakeLockInternal: lock=862109980, flags=0x1, tag="wake:bidsy.app.bidsy/communications.FCMService", ws=null, uid=10354, pid=24073
08-14 12:09:25.640 800-4739/? D/PowerManagerNotifier: onWakeLockAcquired: flags=1, tag="wake:bidsy.app.bidsy/communications.FCMService", packageName=bidsy.app.bidsy, ownerUid=10354, ownerPid=24073, workSource=null
08-14 12:09:25.683 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-Creating service: CreateServiceData{token=android.os.BinderProxy@1c269013 className=communications.FCMService packageName=bidsy.app.bidsy intent=null}
08-14 12:09:25.683 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-CREATE_SERVICE handled : 0 / CreateServiceData{token=android.os.BinderProxy@1c269013 className=communications.FCMService packageName=bidsy.app.bidsy intent=null}
08-14 12:09:25.685 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-SERVICE_ARGS handled : 0 / ServiceArgsData{token=android.os.BinderProxy@1c269013 startId=1 args=Intent { act=com.google.firebase.MESSAGING_EVENT pkg=bidsy.app.bidsy cmp=bidsy.app.bidsy/communications.FCMService (has extras) }}
08-14 12:09:25.684 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-Calling onStartCommand: communications.FCMService@3e035250, flags=0, startId=1
08-14 12:09:25.691 800-1592/? D/PowerManagerService: releaseWakeLockInternal: lock=862109980 [wake:bidsy.app.bidsy/communications.FCMService], flags=0x0, total_time=52ms
08-14 12:09:25.691 800-1592/? D/PowerManagerNotifier: onWakeLockReleased: flags=1, tag="wake:bidsy.app.bidsy/communications.FCMService", packageName=bidsy.app.bidsy, ownerUid=10354, ownerPid=24073, workSource=null
08-14 12:09:25.692 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-Destroying service: communications.FCMService@3e035250
Run Code Online (Sandbox Code Playgroud)

似乎消息到达服务但没有显示.

当然,我不在日志中使用任何过滤器来检查消息是否到达onMessageReceived

我发现类似的问题在这里没有回答,有相同的日志:

无法接收推送通知消息

在查看整个日志详细信息之后,我看到当我发送消息时发生以下Firebase错误:

D / FirebaseMessaging: Unknown intent action: com.google.firebase.MESSAGING_EVENT
Run Code Online (Sandbox Code Playgroud)

我的问题的解决方案在这里:

我在使用旧版本的FCM时遇到了一个问题,即10.2.6未知的意图操作:com.google.firebase.MESSAGING_EVENT

Jac*_*1re 13

1. tl;博士

从某个地方发送的消息需要具有数据有效负载且没有通知负载,或者它们不会在MessagingService中的"onMessageReceived"内一致地到达.

通知消息包含一组预定义的用户可见键.相反,数据消息仅包含用户定义的自定义键值对.通知消息可以包含可选的数据有效负载.

("Notification messages can contain an optional data payload"如果您的应用程序位于前台,这只会提交给您的服务!)

  • 从控制台创建的消息将始终是通知消息!

  • 您无法发送明文数据消息,这些消息将始终通过firebase-console到达您的服务.这只能通过REST-API(FCM协议)或Admin SDK实现.

更重要的是:

如果您发送带有数据有效负载的通知消息,您必须处理,如果应用程序位于前台,您必须通过服务处理它,还必须从您的Launch-Activity将接收的Intent中收集数据,这将是如果用户点击通知,则打开!数据有效负载将在意图内!


2.消息类型:

通知消息和数据消息.

  1. 通知消息包含一组预定义的用户可见键.通知消息具有可选的通知有效负载,并将传递到用户系统托盘.

    • 如果应用程序位于前台,则onMessageReceived如果通知具有数据有效负载,则它们将调用.

    • 如果应用程序是后台应用程序,则将显示通知,并通过启动活动的意图给出数据有效负载.

    • 如果通知没有可选的数据有效负载,则会显示通知,并在单击时打开应用程序.

  2. 数据消息仅包含用户定义的自定义键值对.(如下所述).如果您希望消息始终调用onMessageReceived,则它们不应包含通知有效负载,而应包含数据有效负载.

来自文档:

客户端应用程序负责处理数据消息.数据消息只有自定义键值对.(!再一次 - 只有自定义键值对)

您可以在此处阅读有关消息类型的信息:Fcm消息类型


3.数据有效载荷

数据有效负载是一个简单的json条目,另外在您的有效负载中,可以有简单的键值对.

例:

  "data": {
        "eventId" : "1",
        "flavors" : "alpha",
        "minFcmVersion" : "3",
        "showFallbackOnLowVersion" : "false"
  }
Run Code Online (Sandbox Code Playgroud)

在控制台内部,如果在"扩展选项"字段下面输入内容,则可以添加数据有效负载:

在此输入图像描述

从控制台创建的消息将始终是通知消息!

首先,通过控制台直接向您的设备发送firebase云消息(使用fcm令牌)并添加带有示例值的简单数据负载.现在检查是否调用了onMessageReceived服务.(你的app必须在前台!)

后端

使用REST API,您可以发送仅包含自定义键值对的数据消息,并始终提供给您的服务!

您的后端应该组成消息本身并添加数据有效负载.这在某种程度上描述了:HTTP协议数据有效载荷

您还可以通过在线找到的几个http请求构建器之一测试后端明智的发送消息.我喜欢:hurl.it和

Post 至:

https://fcm.googleapis.com/fcm/send

4. Gradle

顺便说一句:'com.google.firebase:firebase-messaging:11.0.4'现在出去了.较低版本中存在错误.

5.链接和良好的阅读

这里更好的阅读文档:接收消息文档 和作为SOF的消息类型的一个很好的解释答案:SOF - 答案 - 消息类型