FCM android onmessagereceived not called

Posted

技术标签:

【中文标题】FCM android onmessagereceived not called【英文标题】: 【发布时间】:2017-12-25 18:40:14 【问题描述】:

我已经在应用中实现了 FCM。其他 firebase 功能运行良好,即上传到 firebase 存储和 firebase 实时消息传递。但是当我第一次向设备发送推送通知时,它显示成功发送通知,但在 messagereceived 上没有调用。然后当我发送另一个推送通知时,它立即显示未注册。然后它总是没有注册。

public class MyFirebaseMessagingService extends FirebaseMessagingService 

@Override
public void onMessageReceived(RemoteMessage remoteMessage) 
    Log.d("myLog", "From: " + remoteMessage.getFrom());
    Log.d("myLog", "Notification Message Body: " + remoteMessage.getNotification().getBody());


app.gradle:

apply plugin: 'com.google.gms.google-services'

project.gralde:

classpath 'com.google.gms:google-services:3.1.0'

清单:

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

设备令牌已正确刷新,当我清除数据并重新打开应用程序时,它会立即打印新的设备令牌。

【问题讨论】:

显示您的设备注册码 【参考方案1】:

onMessageReceived(RemoteMessage remoteMessage)方法基于以下情况调用。

FCM 响应带有通知数据块:

"to": "设备令牌列表", “通知”: "body": "你的通知正文", "title": "你的通知标题" , “数据”: "body": "您的数据通知正文", "title": "你在 Title 中的通知标题", "key_1": "key_1 的值", "image_url": "www.abc.com/xyz.jpeg", "key_2": "key_2 的值"

    前台应用:

onMessageReceived(RemoteMessage remoteMessage) 调用,在通知栏中显示 LargeIcon 和 BigPicture。我们可以从 notificationdata

中读取内容
    后台应用:

onMessageReceived(RemoteMessage remoteMessage) 未调用,系统托盘将接收消息并从 通知 块中读取正文和标题,并在通知栏中显示默认消息和标题。

FCM 响应仅使用 数据 块:

在这种情况下,从 json 中删除 notofocation

"to": "设备令牌列表", “数据”: "body": "您的数据通知正文", "title": "你在 Title 中的通知标题", "key_1": "key_1 的值", "image_url": "www.abc.com/xyz.jpeg", "key_2": "key_2 的值"

    前台应用:

onMessageReceived(RemoteMessage remoteMessage) 调用,在通知栏中显示 LargeIcon 和 BigPicture。我们可以从 notificationdata

中读取内容
    后台应用:

onMessageReceived(RemoteMessage remoteMessage) 调用,系统托盘将不会收到消息,因为 notification 键不在响应中。在通知栏中显示 LargeIcon 和 BigPicture

代码

 private void sendNotification(Bitmap bitmap,  String title, String 
    message, PendingIntent resultPendingIntent) 

    NotificationCompat.BigPictureStyle style = new NotificationCompat.BigPictureStyle();
    style.bigPicture(bitmap);

    Uri defaultSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
    String NOTIFICATION_CHANNEL_ID = mContext.getString(R.string.default_notification_channel_id);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 
        NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "channel_name", NotificationManager.IMPORTANCE_HIGH);

        notificationManager.createNotificationChannel(notificationChannel);
    
    Bitmap iconLarge = BitmapFactory.decodeResource(mContext.getResources(),
            R.drawable.mdmlogo);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(mContext, NOTIFICATION_CHANNEL_ID)
            .setSmallIcon(R.drawable.mdmlogo)
            .setContentTitle(title)
            .setAutoCancel(true)
            .setSound(defaultSound)
            .setContentText(message)
            .setContentIntent(resultPendingIntent)
            .setStyle(style)
            .setLargeIcon(iconLarge)
            .setWhen(System.currentTimeMillis())
            .setPriority(Notification.PRIORITY_MAX)
            .setChannelId(NOTIFICATION_CHANNEL_ID);


    notificationManager.notify(1, notificationBuilder.build());



参考链接:

https://firebase.google.com/docs/cloud-messaging/android/receive

【讨论】:

【参考方案2】:

您使用什么设备进行测试?众所周知,小米和 Leeco 等一些制造商会阻止应用接收 FCM 通知。

对于三星、摩托罗拉等设备:确保您处理的是正确的消息类型。您可以发送两种类型的 FCM 消息。

    通知消息 数据消息

阅读此页面了解更多信息。

https://firebase.google.com/docs/cloud-messaging/concept-options

【讨论】:

我已经检查了大多数设备,moto X play,samsung s6 等。 更新了我的答案。【参考方案3】:

它取决于来自控制台的消息类型的类型。 如果它只有通知消息,那么如果您的应用已关闭,那么您的接收器将不会被触发。 如果它带有 通知消息数据消息,那么当应用处于前台时,您的应用仍然可以处理此消息

确保您正在使用此依赖项compile 'com.google.firebase:firebase-messaging:10.2.1'

【讨论】:

以上是关于FCM android onmessagereceived not called的主要内容,如果未能解决你的问题,请参考以下文章

FCM 推送通知在 android 中不起作用(使用 cordova-plugin-fcm 2.1.1 的 Ionic 项目)

FCM - 通过设备令牌和环境/组发送 android 推送通知

FCM - 从 Java 向我的 android 设备发送通知

Android推送通知的FCM限制?

未发送 Android FCM 推送通知

Android推送通知的自定义声音不起作用(FCM)