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

问题描述 投票:55回答:6

我正在尝试向所有应用用户(在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"
    }
}

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

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

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

好吧,然后我在这里尝试了解决方案:Firebase Java Server to send push notification to all devices在我看来说“好吧,即使通过管理控制台可以向所有人发送通知......但实际上不可能通过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,带有“InvalidRegistration”的200代码表示注册令牌存在问题。也许?因为文档的这一部分是针对消息传递服务器的。通知服务器是否相同?不清楚。我在其他地方看到这个主题可能需要几个小时才能激活。这似乎会使创建新的聊天室变得毫无用处,所以这似乎也是如此。

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

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

android firebase firebase-cloud-messaging firebase-notifications
6个回答
77
投票

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

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

  1. to specific devices,如果你知道他们的设备ID
  2. to groups of devices,如果您知道组的注册ID
  3. to topics,它们只是设备可以订阅的密钥

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

要发送到主题,您的命令中会出现语法错误。从/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!",
   }
}

57
投票

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

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

现在发送请求为

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

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

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


4
投票

一种方法是让所有用户的设备订阅主题。这样,当您将消息定位到特定主题时,所有设备都将获得它。我想这就是Firebase控制台中的Notifications部分如何做到的。


1
投票

只需让登录的所有用户订阅特定主题,然后向该主题发送通知即可。


1
投票

我正在为我的Ionic Cordova app推送通知寻找解决方案。

感谢Syed Rafay的回答。

在app.component.ts中

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

在服务器文件中

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

0
投票

您可以使用condition密钥并将消息发送到不在组中的实例,而不是订阅主题。您的数据可能如下所示:

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

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


-3
投票

您可以使用/ topics / all,但必须转到面板Firebase并进行更改

匿名>>>>>启用

enter image description here


-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!",
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.