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

And*_*rs8 61 android firebase firebase-cloud-messaging firebase-notifications

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

curl --insecure --header"授权: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"
    }
}
Run Code Online (Sandbox Code Playgroud)

回复的响应只有两个字符:

就是这样,"to"这个词.(Headers报告400)我怀疑这与我的JSON中没有"to"有关.人们甚至会为"去"做什么?我没有定义主题,设备没有注册任何东西.但是,他们仍然可以从Firebase管理面板接收通知.

由于Firebase通知处理的惊人限制,我想尝试"仅数据"JSON包,如果您的应用程序在前台,通知将由您的处理程序处理,但如果您的应用程序在后台,则会获得由Firebase服务内部处理,并且从未传递给您的通知处理程序.显然,如果您通过API提交通知请求,则可以解决此问题,但仅限于仅使用数据进行通知请求.(这会破坏使用相同消息处理iOS和Android的能力.)在我的任何JSON中用"data"替换"notification"都没有效果.

好的,然后我在这里尝试了解决方案:Firebase Java Server向所有设备发送推送通知, 在我看来说"好吧,即使通过管理控制台向所有人发送通知......也不可能通过API. " 解决方法是让每个客户端订阅一个主题,然后将通知推送到该主题.首先是onCreate中的代码:

FirebaseMessaging.getInstance().subscribeToTopic("allDevices");
Run Code Online (Sandbox Code Playgroud)

那么我发送的新JSON:

{
"notification":{
    "title":"note-Title",
    "body":"note-Body"
    },
"to":"allDevices"
}
Run Code Online (Sandbox Code Playgroud)

所以现在我至少得到了服务器的真实回复.JSON响应:

{
"multicast_id":463numbersnumbers42000,
"success":0,
"failure":1,
"canonical_ids":0,
"results":
    [
    {
    "error":"InvalidRegistration"
    }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

当我从头开始编写应用程序时,我很兴奋,因为我以前从未使用过Firebase,只需几个小时即可收到通知.在达到Stripe.com文档的水平之前,它似乎还有很长的路要走.

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

Fra*_*len 81

Firebase Notifications没有用于发送邮件的API.幸运的是,它建立在Firebase云消息传递之上,它具有这样的API.

使用Firebase Notifications和Cloud Messaging,您可以通过三种方式向设备发送所谓的下游消息:

  1. 如果您知道他们的设备ID,请访问特定设备
  2. 如果您知道组的注册ID,则为设备
  3. 主题,这只是设备可以订阅的密钥

您会注意到无法明确发送到所有设备.您可以使用其中的每一个来构建此类功能.

要发送到主题,您的命令中会出现语法错误.主题通过开头来确定/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!",
   }
}
Run Code Online (Sandbox Code Playgroud)

  • `/ topics /`是复数 (5认同)

Sye*_*fay 60

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

FirebaseMessaging.getInstance().subscribeToTopic("all");
Run Code Online (Sandbox Code Playgroud)

现在发送请求为

{
   "to":"/topics/all",
   "data":
   {
      "title":"Your title",
      "message":"Your message"
      "image-url":"your_image_url"
   }
}
Run Code Online (Sandbox Code Playgroud)

这可能是低效或非标准的方式,但正如我上面提到的那样,这是最简单的方法.如果您有更好的方式向所有设备发送推送通知,请发布.

如果您不熟悉使用Firebase云消息传递教程发送推送通知- 使用FCM推送通知,则可以按照本教程进行操作

  • 我不认为这是低效的,这可能是向所有设备发送推送通知的唯一可能方式(我至少找不到任何其他方式) (2认同)
  • 很好的答案.因为在任何地方都没有提到,所以知道你将在`Service`中收到这种消息是很重要的,它在`#onMessageReceived`函数中扩展了`FirebaseMessagingService`.因此,通知不会自动显示,您必须自己处理. (2认同)

小智 5

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

{
    "data": {
        "foo": "bar"
    },
    "condition": "!('anytopicyoudontwanttouse' in topics)"
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我使用这种方法已经有一段时间了,并且工作得很好,今天由于某种原因,我将通知发送到旧版 api,它返回给我的 message_id 没有错误,但设备没有收到推送通知,任何猜测都会是什么问题?测试发送到单个令牌并且工作正常。 (5认同)
  • 这是最好的答案。它可以立即运行,无需更新应用程序。伟大的! (3认同)