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。我们可以从 notification 和 data 块
中读取内容-
后台应用:
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。我们可以从 notification 和 data 块
中读取内容-
后台应用:
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 推送通知