通过GCM向Android/IOS推送静默通知

22

我想要向一个应用程序发送状态更新,可以选择静默或非静默。

例如,如果用户收到了一条来自好友的新消息,我想要发送这样的消息,并且能够显示带声音的警报。

但是在静默情况下,我希望用户不会察觉到这样的通知,它必须被应用程序收集;例如,如果我的用户拥有两个设备并在其中一个设备上更改了他的姓名,我希望向另一个设备(处于睡眠状态)发送一个静默的姓名更新,这应该会在后台触发更改(被分派给应用程序)。

根据我所看到的,这是可能实现的,但是我对其实际实现方式或应该如何实现感到非常困惑,有时还存在一些矛盾之处。作为后端开发人员,我可以做任何事情,但我需要确保它对前端开发人员也适用。

以下是相关主题:

iOS和Android上的静默后台推送

无警报的推送通知

iPhone推送通知无警报

Android静默推送

2个回答

55

Android:

更新: FCM的新文档:https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages

只要在负载中不包括notification标签并将其放入data标签中,您就会收到静默通知。

以下示例将显示一个通知:

{ "notification": {
    "title": "Portugal vs. Denmark",
    "text": "5 to 1"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}

这将不会显示通知。

{
   "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
   "data" : {
     "Nick" : "Mario",
     "body" : "great match!",
     "Room" : "PortugalVSDenmark"
   },
 }

点击此处阅读更多:https://developers.google.com/cloud-messaging/concept-options#notifications_and_data_messages

iOS

向您的 JSON 负载添加标签contentAvailable:1,即可收到静默通知。

就是这么简单。


5
你好,感谢您的提问。在安卓系统中,用户可以禁用推送通知。如果用户在设置中禁用了某个应用的推送通知,那么静默推送会发生什么呢?用户依然可以收到数据通知吗? - savepopulation
2
iOS的正确标签是“content-available”,您必须确保不在“aps”字典中包含“sound”,“badge”或“alert”键。您还需要配置您的应用程序以具有“远程通知”后台模式。https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CreatingtheNotificationPayload.html#//apple_ref/doc/uid/TP40008194-CH10-SW8 - Alec
我的经验是它不是这样工作的。如果你发送一个“data”属性,那么托盘中的通知仍然会显示默认应用程序名称。如果“data”包含“title”和“body”,那么这两个将被显示。适用于Android,尚未在iPhone上进行测试。 - Jiri Matejka

10

接受的答案指向一个已经被废弃的文档。

相反,您应该使用这个文档:Firebase文档

数据消息看起来像这样:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "data":{
      "Nick" : "Mario",
      "body" : "great match!",
      "Room" : "PortugalVSDenmark"
    }
  }
}

同时还有通知消息:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    },
    "data" : {
      "Nick" : "Mario",
      "Room" : "PortugalVSDenmark"
    }
  }
}

希望这可以让其他人避免我因为已接受的答案而头疼的情况。

已经很久没见了 :) - Onza
3
@Onza 确实 :) 但它仍然出现在谷歌搜索中,所以我猜其他人也可能会找到它。不过我可能应该看一下日期。 - Kristian Barrett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接