FCM通知标题仍为“FCM消息”。

5

我正在尝试使用Firebase Cloud Messaging。 我从Node.js服务器向已注册到通知系统的应用程序发送通知。

我的问题是,在Android 5.1上,即使我在通知JSON中设置了标题属性,通知仍为“FCM消息”。 在Android 6.0中运行良好。 我也尝试重新启动设备。

enter image description here

这是我用来发送通知的代码:
function sendNotificationToUser(userToken, message, onSuccess) {
  request({
    url: 'https://fcm.googleapis.com/fcm/send',
    method: 'POST',
    headers: {
      'Content-Type' :' application/json',
      'Authorization': 'key='+API_KEY
    },
    body: JSON.stringify({
      notification: {
        "title": 'My App Name',
        "body": message,
        "sound": 'default'
      },
      to : userToken
    })
  }, function(error, response, body) {
    if (error) { console.error(error); }
    else if (response.statusCode >= 400) { 
      console.error('HTTP Error: '+response.statusCode+' - '+response.statusMessage); 
    }
    else {
      onSuccess();
    }
  });
}

你可以看到我发送的通知标题是"My App Name",但在设备上显示为"FCM Message"。

我该怎么做?!


这是一个由 onMessageReceived 处理的通知还是在通知栏中处理的通知? - Neria Nachum
这不是服务器端的问题,问题出在Android代码的onMessageReceived函数。 - Ganesh Pokale
4个回答

6

需要传递标题,然后接收 remoteMessage.getNotification().getTitle() ,这将捕获标题并在顶部显示或者完整地从web传递JSON,然后像这样接收:

JSONObject jsonObject = new JSONObject(remoteMessage.getData());

下面是完整的方法:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // ...
    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://firebase.google.com/support/faq/#fcm-android-background
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());
    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

Ref link


5
我发现这是一个与onMessageReceived回调相关的问题。
如您在FCM接收指南中看到的那样。
请参考以下链接以获取更多信息:enter image description here

1

这是预期的。(已测试至Android 10)

FCM对于应用程序状态(前台和后台/被杀死)有不同的行为。您应该根据您的用例从服务器发送有效负载来处理此问题。

从仪表板或服务器端api中发送的消息必须以“通知”或“数据”格式之一发送。 注意:从Firebase仪表板,您只能发送“通知”正文而不是数据。在这种情况下,FCM将直接显示通知,而不会给您的应用程序回调。

服务器端 以下是示例格式:

通知类型格式 注意:Android系统将默认在通知托盘中显示通知,您无需显示它。

 { 
    "to": "your_token_id",
     "notification" : {
             "title" : "FCM Notification title!",
             "body" : "FCM Notification subtext!",
             "content_available" : true,
             "priority" : "high"
     }
}

数据格式(用于在应用程序中前台和后台接收回调) 注意:您需要自行处理回调并显示通知。

{ 
    "to": "your_token_id",

    "data" : {
         "title" : "FCM Notification Title ",
         "subtext" : "FCM Notification Sub Title",
         "type" : "999",
         "priority" : "high"
    }
}

Android客户端 为了处理在您的Android接收器中接收到的有效负载,请查看官方指南这里

override fun onMessageReceived(remoteMessage: RemoteMessage) {

    Log.d(TAG, "From: ${remoteMessage.from}")

    // Check if message contains a data payload.
    remoteMessage.data.isNotEmpty().let {
        Log.d(TAG, "Message data payload: " + remoteMessage.data)

        if (/* Check if data needs to be processed by long running job */ true) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            scheduleJob()
        } else {
            // Handle message within 10 seconds
            handleNow()
        }
    }

    // Check if message contains a notification payload.
    remoteMessage.notification?.let {
        Log.d(TAG, "Message Notification Body: ${it.body}")
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

查看文档 这里

enter image description here


0

这是我从远程消息中获取标题的方式:

 var title = ""
 override fun onMessageReceived(remoteMessage: RemoteMessage) {
    if (remoteMessage.notification != null) {
        title = remoteMessage.notification!!.title!!
    }
}


val notificationBuilder = NotificationCompat.Builder(applicationContext, channelId)
                         .setContentTitle(title)

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