提问者:小点点

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


null

curl--不安全--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”有关。一个“to”会是什么意思呢?我没有定义主题,设备也没有为任何东西注册自己。然而,他们仍然能够接收来自Firebase管理面板的通知。

由于Firebase通知处理的惊人限制,我想尝试一个“只提供数据”的JSON包,如果您的应用程序在前台,通知由您的处理程序处理,但是如果您的应用程序在后台,它由Firebase服务在内部处理,并且从不传递给您的通知处理程序。显然,如果您通过API提交通知请求,这是可以解决的,但前提是您只使用数据。(这就破坏了用同样的消息处理iOS和Android的能力。)在我的任何JSON中用“数据”替换“通知”都没有效果。

好的,然后我尝试了这里的解决方案:Firebase Java服务器发送推送通知到所有设备,这在我看来似乎是说“好的,即使通知到每个人都可以通过管理控制台。。。这是不可能通过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来向所有运行应用程序的设备发送消息以镜像管理控制台功能吗?


共3个答案

匿名用户

编辑:似乎不再支持此方法(thx至@fernandozamperin)。请看其他答案!

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

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

null

匿名用户

null

通过Firebase通知和云消息传递,您可以通过三种方式向设备发送所谓的下游消息:

您将注意到,没有办法显式地发送到所有设备。但是,您可以使用其中的每一个构建这样的功能,例如:在应用程序启动时为其订阅主题(例如),或者保存所有设备ID的列表,然后将消息发送给所有这些设备。

对于发送到主题,您的命令中有一个语法错误。主题以开头标识。由于您的代码中没有它,服务器将解释为设备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!",
   }
}

匿名用户

我想出的向所有设备发送推送通知的最简单方法是为它们订阅一个主题“所有”,然后向这个主题发送通知。把这个复制到你的主activity里

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

现在将请求发送为

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

这可能是低效或非标准的方式,但正如我上面提到的,这是最简单的。请做张贴,如果你有任何更好的方法发送一个推送通知到所有的设备。

如果您是使用Firebase云消息传送教程发送推送通知的新手,可以遵循本教程-使用fcm/sub>

若要向主题的组合发送消息,请指定一个条件,该条件是指定目标主题的布尔表达式。例如,以下情况将向订阅的设备发送消息:

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

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