如何在Android 8中为FCM推送消息指定Android通知通道

Vit*_*nko 13 android amazon-sns firebase-cloud-messaging notification-channel

我们的应用程序现在有targetSdkVersion 26(Android 8),该应用程序使用FCM推送通知.

由于FCM文档规定我将FCM客户端库更新为版本11.2.0:

dependencies {
     compile 'com.google.firebase:firebase-messaging:11.2.0'
}
Run Code Online (Sandbox Code Playgroud)

通过此FCM客户端库更新,FCM通知开始出现在Android设备上.很好,但是当应用程序处于后台时,它是处理FCM消息的系统,因此它使用名为"Miscellaneous"的默认Android通知通道,这不是我们想要的(我们在该列表中有其他通知通道和"其他"声音混乱) ).

正如FCM文档所述,有一种方法可以为FCM消息指定默认通知通道:

(可选)在应用程序组件中,元数据元素用于设置通知的默认图标,颜色和通知通道(Android O中的新增功能).只要传入的消息没有明确设置图标,颜色或notification_channel,Android就会使用这些值.

但是没有显示代码示例(样本仅显示图标和颜色).所以我只是通过在github上使用Firebase云消息传递快速入门中的一个示例来搜索:

<meta-data
    android:name="com.google.firebase.messaging.default_notification_channel"
    android:value="@string/default_notification_channel_id"/>
Run Code Online (Sandbox Code Playgroud)

但它不起作用 - FCM通知仍然出现在"杂项"频道中.我在日志中看到:

W/FirebaseMessaging:AndroidManifest中缺少默认通知通道元数据.将使用默认值.

当然,我试图重新安装该应用程序.还有问题.

好吧,理想情况下,应该有一些方法在发送消息时在后端指定通知通道.允许测试发送的FCM开发控制台现在在UI中有这样的选项:

在此输入图像描述

它工作正常.然而,我们的后端使用Java Amazon SNS API,我不知道该API是否允许在发送消息时指定Android通知通道(因为它是一个新的Android功能,亚马逊需要时间来采用它).因此,设置默认通知通道AndroidManifest.xml现在是一种有效的解决方法,但它不起作用.

Abd*_*san 11

依赖于此资源:https://firebase.google.com/docs/cloud-messaging/http-server-ref

这里的有效负载看起来像:

{
   "to":"$device_token"
   "notification":{
      "title":"Title",
      "body":"Here Body",
      "android_channel_id":"$channel_id", // For Android >= 8
      "channel_id":"$channel_id", // For Android Version < 8
      "image": "https://xxxxx.com/xxxxx.jpeg"
   },
   "data":{},
   "priority":"normal"
}
Run Code Online (Sandbox Code Playgroud)

  • 这就是我要找的,你们,检查这个答案代码注释,他指定`android_channel_id`和`channel_id` (4认同)

li2*_*li2 10

FCM 已迁移到HTTP v1 API

https://fcm.googleapis.com/v1/projects/{{projectId}}/messages:send
Run Code Online (Sandbox Code Playgroud)

android_channel_id 会导致错误的请求:

"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
  {
    "field": "message.notification",
    "description": "Invalid JSON payload received. Unknown name \"android_channel_id\" at 'message.notification': Cannot find field."
  }
Run Code Online (Sandbox Code Playgroud)

正确的有效载荷应该是:

{
    "message": {
        "token": "{{deviceToken}}",
        "notification": {
            "body": "This is an FCM notification message hello 23",
            "title": "FCM Message",
            "image": "https://lumiere-a.akamaihd.net/v1/images/au_moviesshowcase_mulan_poster_r_2_54011055.jpeg?region=0,0,960,1420"
        },
        "android": {
          "notification": {
            "channel_id": "channel_id_1"
          }
        },
        "data": {
            "key1": "42",
            "key2": "sent by 21"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages#resource:-message

  • @VitKhudenko但是问题是当应用程序在后台时,如果有效负载包含“通知”部分,则不会调用“onMessageReceived”,这意味着如果您需要调用“onMessageReceived”,则不能将通道ID放入有效负载中问题应用程序处于前台或后台。完全不知道如何让它们都工作。哈哈 (2认同)

use*_*216 9

查看文档:https://firebase.google.com/docs/cloud-messaging/http-server-ref

android_channel_id通知的频道ID(Android O中的新增功能).

在收到使用此密钥的任何通知之前,应用必须创建具有此ID的频道.

如果您未在请求中发送此密钥,或者您的应用尚未创建提供的频道ID,则FCM会使用您的应用清单中指定的频道ID.

尝试android_channel_id在json中包含你即将发布到fcm.我不知道为什么显性价值不适合你.尝试只为您的请求添加频道,您应该获得与Firebase控制台相同的效果.

编辑:我刚刚意识到你要求亚马逊客户端集成.也许你能够手动构建json请求(我不太了解亚马逊服务,对不起).

  • 我如何创建 **android_channel_id** (2认同)
  • 引用的链接指向标记为 Legacy HTTP Server Protocol 的部分,但主要协议部分没有提及 **android_channel_id** (2认同)