Firebase onMessageReceived未被调用

13

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


    }

}

应用 Gradle:

  compile 'com.google.firebase:firebase-messaging:10.2.6'

清单:
   <service android:name="communications.FCMService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
    </service>

- 我发送消息来自FCM控制台,但消息没有到达。 FCM控制台在消息发送时显示“OK”。 - 我从Java服务器发送消息,但消息没有到达。 Java服务器在消息发送时显示“OK”。 - 为了发送消息,我使用Android设备中生成的令牌。 - 以前,我错误地导入了FCM库,但该错误已经解决。当发生过去的错误时,每次发送消息时,在Android上会发生异常。现在没有收到任何消息。 - 我在Android设备上有互联网连接,并且我通过另一个我过去实现的应用程序从GCM(而不是FCM)接收消息。 - 应用程序在前台运行。 - 一些带有“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

看起来消息已经到达服务,但没有显示。

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

我在这里找到了一个类似的问题,但没有得到答案,日志相同:

无法接收推送通知消息

详细查看整个日志后,我发现当我发送消息时,会出现以下Firebase错误

D / FirebaseMessaging: Unknown intent action: com.google.firebase.MESSAGING_EVENT

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

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


1
你确定你的授权密钥和设备令牌仍然有效吗?当你重新安装时,设备令牌会改变。请确保你的google-services.json文件也是有效的。 - Vinayak B
在每个测试中,我卸载了应用并生成了一个新的令牌。Android Firebase 工具告诉我应用已正确连接到项目。 - user2983041
我从 FCM 控制台发送消息。消息的文本是必需的。 - user2983041
是的,但如果您的有效载荷没有“数据”部分,则这些消息将不会到达您的MessagingService,尽管它们会显示。 - JacksOnF1re
显示剩余3条评论
2个回答

21
  1. 简述:

发送消息时,需要使用数据载荷(data payload)而不是通知载荷(notification payload),否则在MessagingService的onMessageReceived方法中,消息可能无法一致地到达。

通知消息包含一组预定义的用户可见键。相比之下,数据消息仅包含您自定义的键值对。通知消息可以包含一个可选的数据载荷。

("通知消息可以包含一个可选的数据载荷",只有当您的应用程序在前台运行时,才会将其提交到您的服务!)

  • 从控制台创建的消息总是通知消息!

  • 您不能通过firebase控制台发送纯数据消息,以确保它们能够一致地到达您的服务。这只能通过REST-API (FCM protocols)Admin SDK实现。

还有一件重要的事情:

如果您发送带有数据载荷的通知消息,而您希望处理该数据,则必须不仅在应用程序处于前台时通过服务来处理它,而且还要从您的启动Activity将接收到的Intent中收集数据,如果用户点击通知,则该Activity将打开!数据载荷将位于意图中!


  1. 消息类型:

通知消息(Notification Messages)数据消息(Data Messages)

  1. 通知消息包含一组预定义的用户可见键。通知消息具有可选的数据载荷
  • 如果应用程序在前台运行,它们将调用onMessageReceived方法 (您需要自己处理通知的显示)

  • 如果应用程序处于后台,通知将被显示(用户系统托盘),如果存在数据载荷,则会在您的launcher Activity的意图的额外信息中传递。

  1. 数据消息(Data Messages)仅包含您自定义的键值对(下面有解释)。如果要确保消息一致地调用onMessageReceived方法,则不应包含通知载荷,而只应包含数据载荷。

来自文档:

客户端应用程序负责处理数据消息。数据消息仅具有自定义键值对。(再次强调-只有自定义键值对)

您可以在此处了解消息类型:Fcm Message Types


  1. 数据载荷(Data Payload)

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

示例:

  "data": {
        "eventId" : "1",
        "flavors" : "alpha",
        "minFcmVersion" : "3",
        "showFallbackOnLowVersion" : "false"
  }

在控制台中,如果您在“扩展选项”字段下输入内容,则可以添加数据有效载荷:

enter image description here

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

首先,通过控制台直接向设备发送 Firebase 云消息(使用 FCM 令牌)并添加一个简单的数据有效载荷,例如值。现在检查您的 onMessageReceived 服务是否被调用。(您的应用必须处于前台!)

后端

使用 REST API 可以发送只包含自定义键值对的数据消息,并且始终到达您的服务!

您的后端应该自己组成消息并添加数据有效载荷。 在此处有些描述:HTTP 协议数据有效载荷

您也可以通过网络上找到的多个 HTTP 请求构建器来测试后端智能发送的消息。我喜欢: hurl.it

Post 到:

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

  1. Gradle

com.google.firebase:firebase-messaging:20.0.0 <- 使用此版本或更高版本

话虽如此,低于 '11.0.4' 版本中存在一个 bug。

  1. 链接和好读物

在此处有更多的文档,可以参考:接收消息文档 以及有关消息类型的良好解释作为 SOF 回答:SOF - Answer - Message Types


我尝试从控制台发送消息,它一直出现,但没有调用服务方法。我在底部更新了我的初始帖子,可能是问题的原因。 - user2983041
1
问题已解决,使用11.0.1版本代替10.2.6版本。问题也在这里:https://stackoverflow.com/questions/44772951/i-faced-a-issue-while-using-the-older-version-of-fcm-i-e-10-2-6-unknown-intent-a - user2983041
很高兴知道它现在可以在11.0.4上运行。愉快编码 :) - JacksOnF1re
当应用程序在后台时,OnMessageReceived从未被调用 - Zaid Mirza
1
@ZaidMirza,我把它更清晰地编辑了一下。简而言之,通过控制台创建的所有消息都是通知消息,并且只有在您的应用程序在前台时才会调用onMessageReceived服务方法。您需要一个后端来调用API! - JacksOnF1re
1
我添加了如何处理通知消息的内容,包括可选的数据负载。 - JacksOnF1re

0

请尝试以下步骤:

  1. 检查您设备中的 Google Play 服务是否已更新。如果没有,请尝试update
  2. 确保您的 Java 服务器代码顺序正确,例如:

    HttpResponse response = Unirest.post("https://fcm.googleapis.com/fcm/send") .header("authorization", "key=your_firebase_key") .header("content-type", "application/json") .header("cache-control", "no-cache") .header("postman-token", "836e187a-c342-ce8a-3a2d-f541a4d8e416") .body("{\r\n\"to\" :\"your_device_token\",\r\n\"data\" : {\r\n\"message\": \"Checking pushnotification\"\r\n}\r\n\t\r\n}") .asString();

    1. 检查 FCMService 类中的日志

FCM已经在工作了。你是使用Android Studio中的Firebase工具添加Firebase还是手动添加的? - Vinayak B
双重方式。首先我使用了工具,但它没有起作用,所以我尝试手动完成所有操作。 - user2983041

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接