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

pre*_*tam 20 notifications android ios firebase firebase-cloud-messaging

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

options = {
     notification: {
          title: "title",
          body:  body,
          sound: 'default'
     },
    priority: "high",
    content_available: true,
    data: {
       type: 'type',
       id: id,
    }
}
Run Code Online (Sandbox Code Playgroud)

这适用于ios和android.但由于某种原因,android方面我们需要发送title,body并且sound对于data有效负载中的密钥而言需要删除notification有效负载.

现在,当应用程序未处于活动状态时,通知未收到ios端,横幅通知未到达但数据在应用处于活动状态时正在接收.我们在iOS方面需要横幅广告.

这个notification关键是banner在iOS中显示的mandetory 吗?

如何为iOS和Android使用相同的有效负载.

options = {

priority: "high",
content_available: true,
data: {
      title: "title",
      body:  body,
      sound: 'default'
      type: 'type',
      id: id,
     }
}
Run Code Online (Sandbox Code Playgroud)

还尝试添加各种组合content_availablepriority键.通过所有FCM文档,它仍然混淆.帮助/建议表示赞赏.

AL.*_*AL. 7

为FCM添加了最新功能,该功能提供了为特定平台提供特定参数的选项,称为Platform Overrides

跨平台自定义消息

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

  • 接收消息的所有应用程序实例将解释的一组通用键。
  • 特定于平台的键块仅由在指定平台上运行的应用程序实例解释。
  • 特定于平台的块使您可以灵活地针对不同平台自定义消息,以确保在收到消息后正确处理它们。在许多情况下,在给定消息中同时使用公共密钥和特定于平台的密钥都是有意义的。

何时使用通用键

  • 每当您在所有平台(iOS,Android和Web)上定位应用程序实例时
  • 当您向主题发送消息时

无论平台如何,所有应用程序实例都会解释的公用密钥是message.notification.title,message.notification.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"
       }
     }
   }
 }
Run Code Online (Sandbox Code Playgroud)

有关消息主体中特定于平台的块中可用键的完整详细信息,请参见HTTP v1参考文档。有关构建包含消息正文的发送请求的更多信息,请参见构建发送请求

  • 感谢您的全面回答,我尝试了这个有效负载,但不幸的是,收到了 400 Bad Request (to) (2认同)

小智 7

以下有效负载可用作 Android 和 iOS 的通用有效负载。“score”只是一个用于解释的虚拟关键字,您可以添加更多,但所有值都应该在字符串中。

{
    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
          }
        }
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

在上面的有效负载中,

  1. 在android中,令牌下面的数据将用作数据有效负载,并且不需要标题和正文的通知,因为它包含在数据本身中。
  2. 对于 iOS,它需要 iOS 的通知标签,这会导致 Android 出现问题。因此,通过删除通知并为 iOS 添加单独的 apns 标签以及 firebase 文档中未给出的新标签“alert”来解决此问题。iOS 将查找 apns 有效负载,并且“警报”将替代“通知”。