如何向特定平台发送通知?

时间:2017-08-30 08:52:03

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

我想向Android和iOS发送两个不同的通知。我想向iOS发送通知消息,这样iOS就会显示一个不错的通知。对于Android我想发送数据消息,这样我就可以在Android上和后台处理通知(因为我不会在后台收到回调并且想要自己处理它)。

我查看了文档,但无法找到有关发送到特定平台的任何信息。我该怎么做?

还欢迎关于如何做到这一点的其他建议,但请记住,我特别想通过Android上的回调自己处理通知(onMessageReceived)

2 个答案:

答案 0 :(得分:6)

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

  

跨平台自定义消息

     

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

     
      
  • 要接收邮件的所有应用实例解释的一组公用密钥。
  •   
  • 特定于平台的密钥块,仅由在指定平台上运行的应用程序实例解释。
  •   
     

特定于平台的块使您可以灵活地为不同平台自定义消息,以确保在接收时正确处理它们。在许多情况下,在给定消息中使用公共密钥和特定于平台的密钥是有意义的。

     

何时使用公共密钥

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

所有应用实例(无论平台如何)解释的公共密钥都是message.notification.titlemessage.notification.bodymessage.data

     

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

     
      
  • 如果您只想将字段发送到特定平台
  •   
  • 除了公共密钥之外,还要发送特定于平台的字段
  •   
     

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

     

当您发送具有特定传送选项的邮件时,请使用特定于平台的密钥进行设置。如果需要,您可以为每个平台指定不同的值;但即使您希望跨平台设置基本相同的值,也必须使用特定于平台的密钥。这是因为每个平台可能会稍微不同地解释该值 - 例如,在Android上将生存时间设置为以秒为单位的到期时间,而在iOS上将其设置为到期日期。 / p>      

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

     

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

     
      
  • 为Android和Web平台设置了较长的生存时间,同时将APN(iOS)消息优先级设置为较低的设置
  •   
  • 设置相应的键,以定义用户点击Android和iOS上的通知的结果 - 分别为click_actioncategory
  •   
{
  "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

我记得以前回答过类似的问题,但似乎无法找到它。目前没有选项指定将发送消息的平台。最简单的方法是使用Topics Messaging。

每次第一次生成令牌时,您都会从客户端应用程序中确定平台类型并将其订阅到相应的主题(例如topics/(Android/iOS)_<Your App Name>),然后根据需要发送消息。

跟踪服务器上的注册令牌也很好,如果您使用的是Firebase数据库,则可以将它们放在节点中:

/pushTokens
  /android
    /{userId} : string
  /ios
    /{userid}: string

这样您就可以从后端进行检查,并在发送单个邮件时根据需要调整有效负载。

答案 1 :(得分:0)

我在Android开发中遇到了同样的问题。我们在后端使用了Laravel。 在后端方面,开发人员必须为两个平台维护不同的方案。

在Android中:

FCM::sendTo($tokens, $option, null, $data);

此处,null作为通知构建器传递。当您在通知中传递null并创建数据库($ data)时,您可以在后台使用app时在 onMessageReceived 方法中接收消息。

适用于iOS:

FCM::sendTo($tokens, $option, $notification, $data);

在这里,您可以在$ notification中传递通知构建器。因此,iOS设备也可以获得通知。