【问题标题】:Firebase onMessageReceived not calledFirebase onMessageReceived 未调用
【发布时间】:2018-01-22 03:15:40
【问题描述】:

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


    }

}

应用分级:

  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>

-我发送消息from FCM console 并没有到达。发送消息时,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

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

Can't receive the push notification message

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

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

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

I faced a issue while using the older version of FCM i.e 10.2.6 Unknown intent action: com.google.firebase.MESSAGING_EVENT

【问题讨论】:

  • 您确定您的授权密钥和设备令牌仍然有效.. 重新安装时设备令牌将更改.. 确保您的 google-services.json 也有效
  • 在每次测试中,我都卸载了应用程序并生成了一个新令牌。 Android Firebase 工具告诉我应用已正确链接到项目。
  • 您的消息是否有“数据”负载?没有数据负载的消息(例如来自控制台)不会到达 FirebaseMessagingService。
  • 我从 FCM 控制台发送消息。消息的文本是强制性的。
  • 是的,但是如果您的有效负载没有“数据”部分,则这些消息将不会到达您的 MessagingService,尽管它们会显示出来。

标签: android firebase firebase-cloud-messaging


【解决方案1】:

1。 tl;博士

您从某处发送的消息需要具有数据负载no通知负载,否则它们将不会一致地到达 在您的 MessagingService 中的“onMessageReceived”内部。

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

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

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

  • 您无法发送纯数据消息,这些消息将始终通过 firebase 控制台到达您的服务。这只能通过REST-API (FCM protocols)Admin SDK 实现。

更重要的一点:

如果您发送带有您希望处理的数据负载的通知消息,您必须不仅在应用程序处于前台时通过服务处理它,而且还从 strong>您的 Launch-Activity 将收到的意图,如果用户单击通知,它将被打开!数据负载将在意图内!


2. 消息类型:

通知消息数据消息

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

    • 如果应用程序在前台,如果通知有数据负载,他们将调用onMessageReceived

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

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

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

来自文档:

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

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


3。数据负载

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

例子:

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

如果您在“扩展选项”字段下方输入内容,您可以在控制台内部添加数据负载:

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

首先,通过控制台直接向您的 设备(使用 fcm 令牌)并添加带有示例值的简单数据有效负载。 现在检查您的服务 onMessageReceived 是否被调用。 (您的应用必须在前台!)

后端

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

您的后端应该自己编写消息并添加数据负载。 这在此处有所描述:HTTP protocol data payload

您还可以通过以下几种方式之一测试后端明智的发送消息 您在网上找到的 http 请求生成器。我喜欢:hurl.it

Post 至:

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

4。摇篮

com.google.firebase:firebase-messaging:20.0.0 ,或更高

也就是说,低于该版本的版本存在错误 '11.0.4'

5。链接和良好的阅读

在此处进一步阅读文档:Receive Messages Documentation 以及关于消息类型作为 SOF 答案的一个很好的解释:SOF - Answer - Message Types

【讨论】:

  • 我试图从控制台发送一条消息,它一直在发送,但它没有调用服务方法。我在底部更新了我最初的帖子,以说明问题的可能原因。
  • 已使用 11.0.1' 而不是 10.2.6 解决。问题也在这里:stackoverflow.com/questions/44772951/…
  • 很高兴知道它现在适用于 11.0.4。快乐编码:)
  • @ZaidMirza 我说得更清楚并编辑了答案。简而言之:通过控制台创建的所有消息始终是 Notification - Messages,并且如果您的应用程序在前台,则只会调用您的 onMessageReceived Service 方法。您需要一个调用 API 的后端!
  • 我添加了如何处理通知消息,带有可选的数据有效负载。
【解决方案2】:

尝试以下情况

  1. 检查您设备中安装的 google play 服务是否是最新的。如果不是,请尝试update
  2. 确保您的 java 服务器代码顺序正确,例如

    HttpResponse 响应 = Unirest.post("https://fcm.googleapis.com/fcm/send") .header("授权", "key=your_firebase_key") .header(“内容类型”,“应用程序/json”) .header(“缓存控制”,“无缓存”) .header("邮递员令牌", "836e187a-c342-ce8a-3a2d-f541a4d8e416") .body("{\r\n\"to\" :\"your_device_token\",\r\n\"data\" : {\r\n\"message\": \"检查推送通知\"\r \n}\r\n\t\r\n}”) .asString();

    1. 在 FCMService 类中检查您的日志

【讨论】:

  • 所以 FCM 正在工作。您是在 android studio 中使用 firebase 工具还是手动添加 firebase?
  • 两种方式。首先我使用了该工具,因为它不起作用,我尝试全部手动完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 2021-02-20
  • 2017-04-22
  • 2017-01-14
相关资源
最近更新 更多