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

时间:2017-01-10 06:53:09

标签: android ios firebase notifications firebase-cloud-messaging

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

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

这适用于ios和android。 但出于某种原因,我们需要向titlebodysound发送data有效负载中的密钥,并且需要删除notification有效负载。

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

在{i}中显示notificationbanner密钥是否具有管理能力?

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

options = {

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

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

2 个答案:

答案 0 :(得分:5)

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

  

跨平台自定义消息

     

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

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

何时使用公共密钥

     
      
  • 每当您在所有平台上定位应用实例时 - iOS,Android和网络
  •   
  • 向主题发送消息时
  •   
     

所有应用程序实例解释的公共密钥都是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"
       }
     }
   }
 }

有关消息正文中特定于平台的块中可用密钥的完整详细信息,请参阅HTTP v1 reference documentation。有关构建包含邮件正文的发送请求的详细信息,请参阅Build Send Requests

答案 1 :(得分:1)

以下有效负载可用作android和iOS的通用有效负载。 “分数”只是用于说明的虚拟关键字,您可以添加更多但所有值都应在字符串中。

{
    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有效负载,而“警报”将替代“通知”。