适用于iOS和Android的FCM远程通知负载



我们使用FCM发送iOS和Android的远程通知。以下是我们从后端发送的有效载荷。

options = {
notification: {
title: "title",
body:  body,
sound: 'default'
},
priority: "high",
content_available: true,
data: {
type: 'type',
id: id,
}
}

这适用于ios和android。但由于某种原因,安卓方面需要为data有效载荷中的密钥发送titlebodysound,并需要删除notification有效载荷。

现在,当应用程序不活动时,通知不会在ios端接收,横幅通知不会到达,但当应用程序活动时,数据正在接收。我们需要iOS端的横幅。

在iOS中显示banner是否必须使用notification密钥

如何在iOS和Android上使用相同的负载。

options = {
priority: "high",
content_available: true,
data: {
title: "title",
body:  body,
sound: 'default'
type: 'type',
id: id,
}
}

还尝试添加具有各种组合的content_availablepriority密钥。浏览了所有FCM文档,它仍然令人困惑。感谢您的帮助/建议。

FCM最近添加了一个功能,该功能提供了为特定平台提供特定参数的选项,称为平台覆盖:

跨平台自定义消息

FCM v1 HTTP协议发送的消息可以包含两种类型的JSON密钥对:

  • 接收消息的所有应用程序实例将解释的一组通用密钥
  • 仅由在指定平台上运行的应用程序实例解释的特定于平台的密钥块
  • 特定于平台的块使您能够灵活地为不同平台自定义消息,以确保在收到消息时能够正确处理这些消息。在许多场景中,在给定的消息中同时使用公共密钥和特定于平台的密钥是有意义的

何时使用通用密钥

  • 无论何时,只要您针对iOS、Android和web等所有平台上的应用程序实例
  • 当您向主题发送消息时

无论平台如何,所有应用程序实例都会解释的通用密钥是message.notification.title、message.notiification.body和message.data.

何时使用特定于平台的密钥

  • 当您只想将字段发送到特定平台时
  • 除了通用密钥之外,还要发送特定于平台的字段

当您只想将值发送到特定平台时,不要使用公共密钥;使用特定于平台的关键块。例如,要只向iOS和web发送通知,而不向Android发送通知,您必须使用两个单独的密钥块,一个用于iOS,另一个用于web。

当您发送带有特定传递选项的邮件时,请使用特定于平台的密钥进行设置。如果需要,可以为每个平台指定不同的值;但是,即使您希望在各个平台之间设置基本相同的值,也必须使用特定于平台的密钥。这是因为每个平台对该值的解释可能略有不同——例如,在Android上,生存时间被设置为以秒为单位的到期时间,而在iOS上,它被设置为到期日期。

示例:带有特定平台交付选项的通知消息

下面的v1发送请求向所有平台发送一个通用的通知标题和内容,但也发送一些特定于平台的覆盖。具体来说,请求:

  • 为Android和Web平台设置长生存时间,同时将APN(iOS)消息优先级设置为低设置
  • 设置适当的键来定义用户在Android和iOS上点击通知的结果——分别是click_action和category
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Match update",
"body":"Arsenal goal in added time, score is now 3-0"
},
"android":{
"ttl":"86400s",
"notification"{
"click_action":"OPEN_ACTIVITY_1"
}
},
"apns": {
"headers": {
"apns-priority": "5",
},
"payload": {
"aps": {
"category": "NEW_MESSAGE_CATEGORY"
}
}
},
"webpush":{
"headers":{
"TTL":"86400"
}
}
}
}

有关消息正文中平台特定块中可用密钥的完整详细信息,请参阅HTTP v1参考文档。有关生成包含消息正文的发送请求的详细信息,请参阅生成发送请求。

以下负载可以用作android和iOS的通用负载"得分;只是一个用于解释的伪关键字,您可以添加更多,但所有值都应该在String中

{
priority: "high",
tokens: [tokens],
data: {
title: <title>,
body:<body>, <-- this data will be used by the android
score: 345.
},
apns: {
headers: {
"apns-priority": "10"
},
payload: {
aps: {          <-- payload for iOS
alert: {
title: <title>,
body:<body>
},
data:{
score: 345
}
}
}
}
}

在上述有效载荷中,

  1. 在android中,低于令牌的数据将被用作数据负载,不需要通知标题和正文,因为它包含在数据本身中
  2. 对于iOS,它需要iOS的通知标签,这导致了Android的问题因此,它可以通过删除通知并为iOS添加单独的apns标签来解决,而firebase文档中没有给出的新标签是";警报";。iOS将寻找apns有效载荷;警报";将代替";通知">

最新更新