【问题标题】:How to send a notification to specific platform?如何向特定平台发送通知?
【发布时间】:2018-02-07 21:45:01
【问题描述】:

我想向 Android 和 iOS 发送两个不同的通知。我想向 iOS 发送通知消息,这样 iOS 会显示一个很好的通知。对于Android,我想发送一条数据消息,这样我可以在Android和后台处理通知(因为我在后台没有收到回调,想自己处理)。

我浏览了文档,但找不到任何关于发送到特定平台的信息。我该怎么做?

也欢迎其他有关如何执行此操作的建议,但请记住,我特别想通过 Android 上的回调 (onMessageReceived) 自己处理通知

【问题讨论】:

  • 我认为您需要在服务器端存储有关具有 Os 类型和 firebase 设备令牌的设备的信息。负责发送通知的应用程序应该找到 iOS 和 Android 设备并根据需要发送正确的通知。我已经这样做了,我可以在我的环境中实现类似的功能
  • @PatrykJabłoński 这可以做到,但是您没有使用 Firebase 的强大功能。我也可以订阅主题 Android 会更好,但仍然不是我想要的。 Firebase 应该有所有这些信息,我只是不知道如何使用它。例如,您可以从控制台专门向应用程序的 Android 版本发送消息。我只是无法通过 http api 在文档中找到它,我还需要将它发送到特定主题。
  • 您想将推送通知从一台设备发送到另一台设备吗? @KevinvanMierlo
  • 我同意它应该有这样的信息,但我从未在 firebase 控制台中看到向特定操作系统类型发送通知的可能性。我只看到了将其发送到应用程序、特定设备(通过令牌)和主题的可能性。如果您能找到它,请与我分享此信息:)
  • @Yuyutsu 不。我正在将推送通知从服务器发送到设备。我遇到的唯一问题是,当应用程序在后台(带有通知消息)时,Android 无法处理推送通知。这就是为什么我想分别向 Android 和 iOS 发送推送。所以我可以在 Android 上使用数据消息,在 iOS 上使用通知消息

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


【解决方案1】:

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

跨平台自定义消息

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

  • 由所有接收消息的应用实例解释的一组通用键。
  • 平台特定的键块仅由在指定平台上运行的应用实例解释。

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

何时使用公共键

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

无论平台如何,所有应用实例解释的公共键是message.notification.titlemessage.notification.bodymessage.data

何时使用特定于平台的键

  • 当您只想将字段发送到特定平台时
  • 发送除公共键之外的特定于平台的字段

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

当您发送具有特定传递选项的消息时,请使用特定于平台的键来设置它们。如果需要,您可以为每个平台指定不同的值;但即使您想跨平台设置基本相同的值,您也必须使用特定于平台的键。这是因为每个平台对该值的解释可能略有不同——例如,在 Android 上将生存时间设置为以秒为单位的过期时间,而在 iOS 上将其设置为过期日期

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

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

  • 为 Android 和 Web 平台设置较长的生存时间,同时将 APNs (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/(Android/iOS)_<Your App Name>),然后根据需要发送消息。

跟踪来自服务器的注册令牌也很好,如果您使用的是 Firebase DB,您可以将它们放在一个节点中:

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

这可以让您在发送单个消息时从后端检查并根据需要调整有效负载。

【讨论】:

  • 谢谢!太糟糕了,没有一种很好的方法可以在 Android 的前台和后台使用 Firebase 并保持 iOS 相同。但这可能是目前最好的解决方案。
  • @KevinvanMierlo 查看我的更新。我自己没有尝试过 Platform overrides,但它似乎是您最初想要的。
  • 谢谢!我会调查的。这绝对是我想要的东西。
  • 平台覆盖似乎是正确的方向。例如,仅发送到 iOS 设备:不要包含通用的顶级 notifications 键并将这些值移动到 apns 部分,遵循 Apple 的 payload dict 结构。
【解决方案2】:

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

在 Android 中:

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

这里,null 作为通知生成器传递。当您在通知中传递null并创建databuilder($data)时,您可以在应用程序在后台时通过onMessageReceived方法接收消息。

对于 iOS:

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

在这里,您可以在 $notification 中传递通知生成器。所以,iOS 设备也可以收到通知。

【讨论】:

  • 是的,但问题是服务器必须知道哪个设备是 Android,哪个设备是 iOS。除了 AL 提供的答案之外,没有办法使用 Firebase 区分 iOS 和 Android。
  • 用户登录时必须有服务器上的操作系统信息。
  • 是的,但这是个问题,因为这样您就不能再使用 Firebase 提供的主题或其他内容了。我们在另一个项目中使用这个解决方案,因为它只有单独的推送通知。但是这个应用需要主题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多