Firebase onMessageReceived未调用

时间:2017-08-14 09:52:23

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


    }

}

App 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>

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

-I从java服务器发送消息,消息不到。发送消息时,Java服务器显示正常。

- 发送消息我在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

似乎消息到达服务但未显示。

当然我不会在日志中使用任何过滤器来检查消息是否到达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

2 个答案:

答案 0 :(得分:11)

1。 TL;博士

从某个地方发送的消息需要具有数据有效负载通知有效负载,否则他们将无法一致 < / em>&#34; onMessageReceived&#34;在MessagingService中。

  

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

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

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

  • 您无法发送普通数据消息,这些消息将始终通过firebase-console到达您的服务。这只能通过REST-API (FCM protocols)Admin SDK进行。

更重要的一点是:

如果您发送带有数据有效负载的通知消息,那么必须不仅可以通过服务处理,如果应用程序位于前台,还可以从< strong>如果用户点击通知,意图将启动您的启动活动,这将打开!数据有效负载将在意图内!

2.消息类型:

通知消息数据消息

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

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

    • 如果应用程序是后台应用程序,则会显示通知,并通过启动活动的意图提供数据有效负载。

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

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

  3. 来自文档:

      

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

    您可以阅读此处Fcm Message Types

    的消息类型

    3。数据有效载荷

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

    示例:

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

    在控制台内部,如果您在&#34;扩展选项&#34;下面输入某些内容,则可以添加数据有效负载。字段:

    enter image description here

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

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

    后端

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

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

    您还可以通过其中一个测试后端明智的发送消息 您在网上找到的http请求构建器。我喜欢:hurl.it

    Post

      

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

    4。摇篮

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

    5。链接和良好的阅读

    此处更好阅读文档:Receive Messages Documentation 作为SOF的消息类型的一个很好的解释答案:SOF - Answer - Message Types

答案 1 :(得分:0)

尝试以下案例

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

    HttpResponse response = Unirest.post(“https://fcm.googleapis.com/fcm/send”)   .header(“授权”,“key = your_firebase_key”)   .header(“content-type”,“application / json”)   .header(“缓存控制”,“无缓存”)   .header(“postman-token”,“836e187a-c342-ce8a-3a2d-f541a4d8e416”)   .body(“{\ r \ n \”to \“:\”your_device_token \“,\ r \ n \”data \“:{\ r \ n \”message \“:\”检查pushnotification \“\ r \ n \ N} \ r \ n \吨\ r \ N}“)   .asString();

    1. 检查您登录FCMService类