您如何通过CURL向所有设备发送Firebase通知?


84

我正在尝试向所有应用程序用户发送通知(在Android上),实际上是在重复通过Firebase管理控制台发送通知时发生的情况。这是我开始的CURL命令:

curl --insecure --header“ Authorization:key = AIzaSyBidmyauthkeyisfineL-6NcJxj-1JUvEM” --header“ Content-Type:application / json” -d“ {\” notification \“:{\” title \“:\” note -Title \“,\” body \“:\” note-Body \“}}”“ https://fcm.googleapis.com/fcm/send

这是解析出来的JSON,在您看来更容易:

{
"notification":{
    "title":"note-Title",
    "body":"note-Body"
    }
}

返回的响应只是两个字符:

就是这样,单词“ to”。(标题报告为400)我怀疑这与JSON中没有“ to”有关。人们甚至会为“到”做些什么?我没有定义主题,设备还没有注册任何东西。但是,他们仍然能够从Firebase管理面板接收通知。

由于Firebase通知处理的惊人局限性,我想尝试“仅数据” JSON包,即如果您的应用程序位于前台,则通知将由您的处理程序处理,但是如果您的应用程序位于后台,则它将得到由Firebase服务内部处理,并且从未传递给您的通知处理程序。显然,如果您通过API提交了通知请求,则可以解决此问题,但是仅当您仅使用数据时才可以解决。(这将破坏用同一条消息处理iOS和Android的能力。)在我的任何JSON中用“数据”替换“通知”均无效。

好的,然后我在这里尝试解决方案:Firebase Java Server将推送通知发送到所有设备 ,在我看来,这是“尽管可以通过管理控制台向所有人进行通知,但实际上不可能通过API进行通知。 ” 解决方法是让每个客户端都订阅一个主题,然后将通知推送到该主题。所以首先在onCreate中的代码:

FirebaseMessaging.getInstance().subscribeToTopic("allDevices");

然后我发送新的JSON:

{
"notification":{
    "title":"note-Title",
    "body":"note-Body"
    },
"to":"allDevices"
}

因此,现在至少我能从服务器获得真正的响应。JSON响应:

{
"multicast_id":463numbersnumbers42000,
"success":0,
"failure":1,
"canonical_ids":0,
"results":
    [
    {
    "error":"InvalidRegistration"
    }
    ]
}

并附带一个HTTP代码200。好吧,根据https://firebase.google.com/docs/cloud-messaging/http-server-ref,一个200代码带有“ InvalidRegistration”意味着注册令牌存在问题。也许?因为该文档的那一部分是针对消息传递服务器的。通知服务器是否相同?不清楚 我在其他地方看到该主题可能需要花费几个小时才能生效。似乎这样会使创建新的聊天室变得毫无用处,所以看起来也是如此。

当我能够从头开始编写一个应用程序时,我感到非常兴奋,而在以前从未使用过Firebase的情况下,短短几个小时就收到了通知。看来要达到Stripe.com文档的水平还有很长的路要走。

底线:有谁知道提供什么JSON来向运行该应用程序的所有设备发送消息以镜像管理控制台功能?


检查您使用的api令牌是否正确。另外,尝试将GCM消息发送到单个设备,看看是否可行。您可以通过在调试中启动应用程序并在FirebaseInstanceIdService
Justin Slade

我没有看到Google在firebase.google.com/docs的快速搜索中显示“ api令牌”。您是说“ ID令牌”吗?或“验证令牌”?还是您在谈论标题中提供的我的授权密钥?这一个罚款:如果我从它是什么改变它,服务器响应切换到“未经授权”,而不是目前我得到的错误消息。
Anders8'7

该博客似乎是关于向特定设备发送消息,而不是像最初的讨论那样,仅向应用程序的所有用户发送消息。
Anders8

阅读此博客文章以了解更多详细信息-> developine.com/…–
Developine

Answers:


55

编辑:似乎不再支持此方法(@FernandoZamperin致谢)。请看看其他答案!

除了订阅主题外,您还可以使用condition键并将消息发送到不在组中的实例。您的数据可能看起来像这样:

{
    "data": {
        "foo": "bar"
    },
    "condition": "!('anytopicyoudontwanttouse' in topics)"
}

请参阅https://firebase.google.com/docs/cloud-messaging/send-message#send_messages_to_topics_2


3
最好的答案。它可以立即运行,而无需更新应用程序。大!
Tom Marvolo Riddle

终于找到了一个-他们真的应该使其更明显,使用
cwiesner

这看起来很有希望,但是真的有效吗?看起来像骇客。我在一个示例项目中尝试了它,并且可以正常工作。但是,我不确定它是否可以与具有成千上万活跃用户的prod应用程序一起使用。有没有人用产品应用程序尝试过?
萨希尔·帕特尔

4
我使用这种方法已经有一段时间了,并且运行良好,今天,由于某种原因,我将通知发送到旧版api,它向我返回message_id,没有错误,但是设备没有收到推送通知,任何猜测都是问题?经过测试的发送到单个令牌,它可以正常工作。
费尔南多·赞佩林

1
@VitVeres我已向Firebase支持团队发送了一个问题,他们的回复是:“不支持您当前使用的扇出推送通知的表达式用法。请确保您的应用程序项目中存在表达式中列出的主题。”,所以我猜猜我将不得不在我的应用程序中实现主题。
费尔南多·赞佩林

98

Firebase通知没有用于发送消息的API。幸运的是,它是基于Firebase Cloud Messaging构建的,而Firebase Cloud Messaging正是具有这样的API。

借助Firebase通知和Cloud Messaging,您可以通过三种方式将所谓的下游消息发送到设备:

  1. 到特定设备(如果您知道其设备ID)
  2. 设备组,如果您知道组的注册ID
  3. 主题,这只是设备可以订阅的键

您会注意到,无法显式发送所有设备。但是,您可以使用其中的每种功能来构建这样的功能,例如:通过在应用程序启动时为其订阅主题(例如/topics/all),或者保留所有设备ID的列表,然后将消息发送给所有这些设备。

要发送到主题,您的命令中存在语法错误。主题以开头/topics/。由于您的代码中没有此名称,因此服务器会将其解释allDevices为设备ID。由于它是设备注册令牌的无效格式,因此会引发错误。

从有关向主题发送消息的文档中:

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to": "/topics/foo-bar",
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}

我尝试提交{“ to”:“ /” topic / allDevices“,” data“:{” message“:”这是Firebase Cloud Messaging主题消息!“}},并收到了相同的InvalidRegistration响应。我认为这意味着该主题无效。我在控制台中看不到任何主题数据库。
Anders8'7

7
/topics/是复数形式
Frank van Puffelen 2016年

傻笑哦,错别字,程序员的祸根。;)新的响应是:{“ message_id”:5115052numbers95180}当然看起来更成功了。因此,听起来最重要的是,尽管管理控制台具有通过“通知”传递通知的强大功能,但是没有办法从API提交中触发该通知,因此应该将自己转换为使用消息。(丢失了通知中内置的计划和转换跟踪),我将寻找消息代码来处理接收。谢谢弗兰克。:)
Anders8'7

1
嗯...不是真的。Notifications控制台仅发送通知消息(请参阅此有关消息类型的文档)。唯一没有API的功能是发送给受众
Frank van Puffelen '16

1
iOS也一样吗?我尝试了相同的操作,但当应用程序处于活动状态时我会收到通知,但在后台却无法正常工作
vinbhai4u

71

我想到的将推送通知发送到所有设备的最简单方法是为它们订阅主题“所有”,然后将通知发送到该主题。将其复制到您的主要活动中

FirebaseMessaging.getInstance().subscribeToTopic("all");

现在将请求发送为

{
   "to":"/topics/all",
   "data":
   {
      "title":"Your title",
      "message":"Your message"
      "image-url":"your_image_url"
   }
}

这可能是效率低下或非标准的方法,但是如上所述,这是最简单的方法。如果您有更好的方法将推送通知发送到所有设备,请进行发布。

如果您不熟悉使用Firebase Cloud Messaging教程发送推送通知,则可以遵循本教程-使用FCM推送通知


要将消息发送到主题组合,请指定condition,这是一个布尔表达式,用于指定目标主题。例如,以下条件会将消息发送到已订阅的设备,TopicA或者TopicB或者TopicC

{
   "data":
   {
      "title": "Your title",
      "message": "Your message"
      "image-url": "your_image_url"
   },
   "condition": "'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"
}

FCM文档上阅读有关条件和主题的更多信息


对于我,这说得通。但是像您一样,我不确定它是否效率低下。拜托,有人可以澄清一下吗?
JCarlosR

2
我认为效率不低,这可能是向所有设备发送推送通知的唯一可能的方法(我找不到其他方法)
Syed Rafay

1
最佳答案!:)
wonsuc

2
好答案。由于在任何地方都没有提到它,因此重要的是要知道您将在函数中Service扩展的范围FirebaseMessagingService内收到这种消息#onMessageReceived。因此,通知不会自动显示,您必须自己处理。
reVerse

4

一种方法是让所有用户的设备都订阅一个主题。这样,当您将消息定位到特定主题时,所有设备都会收到消息。我认为这是Firebase控制台中“通知”部分的工作方式。


阅读此博客文章以了解更多详细信息-> developine.com/…–
Developine

2

我一直在寻找Ionic Cordova应用程序推送通知的解决方案。

感谢Syed Rafay的回答。

app.component.ts中

const options: PushOptions = {
  android: {
    topics: ['all']
  },

服务器文件中

"to" => "/topics/all",


0

在Firebase控制台上检查您的主题列表。

  1. 转到Firebase控制台

  2. 点击从侧面菜单增长

  3. 单击云消息传递

  4. 点击发送您的第一条消息

  5. 在通知部分中,为通知标题通知文本输入内容

  6. 点击下一步

  7. 在目标部分中,单击主题

  8. 单击“消息主题”文本框,然后您可以看到您的主题(我没有创建名为android或ios的主题,但可以看到这两个主题。

  9. 发送推送通知时,请将其添加为条件。

    “ condition” =>“主题中的'all'||主题中的'android'|主题中的'ios'”,

全身

array(
    "notification"=>array(
        "title"=>"Test",
        "body"=>"Test Body",
    ),
    "condition"=> "'all' in topics || 'android' in topics || 'ios' in topics",
);

如果您还有更多主题,则可以添加带有||的主题。(或)条件,然后所有用户都会收到您的通知。测试并为我工作。


-4

您可以使用“ / topics / all”将通知发送到所有设备

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to": "/topics/all",
  "notification":{ "title":"Notification title", "body":"Notification body", "sound":"default", "click_action":"FCM_PLUGIN_ACTIVITY", "icon":"fcm_push_icon" },
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}

这是新功能吗?还是这要求应用程序订阅“全部”?
Anders8

这是默认功能。我不赞成任何话题。它为我工作。但是我做了令牌注册。“
getToken

1
您会收到一条消息ID,是的,但是除非您有名为“ all”的主题,否则什么都不会发送到任何设备。
阿卜杜勒拉曼·沙图

不。我在Android设备中收到了通知(两个)。您要我附上我的屏幕截图吗?我在ioinc上构建我的应用程序。
Siva Karuppiah '17

这对我有用。不知道为什么这会被否决。
m1crdy

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.