27

我试图向所有应用用户发送通知(在Android上),基本上复制了通过Firebase管理控制台发送通知时发生的情况。这里是CURL命令我开始于:如何通过CURL向所有设备发送Firebase通知?

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

这是JSON解析出来让您的眼睛更容易:

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

该回来的反应就是两个字:

就是这样,单词“到”。 (Headers报告400)我怀疑这与在我的JSON中没有“to”有关。甚至会给一个“to”什么?我没有定义任何主题,并且设备没有注册任何内容。但是,他们仍然能够从Firebase管理控制台收到通知。

由于Firebase通知处理的惊人限制,因此如果您的应用处于前台,通知将由您的处理程序处理,但我想尝试“仅限数据”JSON包,但如果您的应用处于背景,它将通过Firebase服务进行INTERNALLY处理,并且永远不会传递给您的通知处理程序。显然,如果你通过API提交你的通知请求,但只有在你使用纯数据的情况下才可以解决这个问题。 (然后就会破坏使用相同消息处理iOS和Android的能力。)在我的任何JSON中将“notification”替换为“data”不起作用。

好了,然后我试图这里的解决方案: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 200代码以“InvalidRegistration”是指与注册令牌的问题。也许?因为这部分文档是用于消息传递服务器的。通知服务器是否一样?不清楚。我在其他地方看到,该主题可能需要几个小时才能发挥作用。看起来这样会让它无法创建新的聊天室,所以这看起来也是如此。

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

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

+0

检查是否使用正确您的API凭证推送通知您可以按照本教程。也尝试发送GCM消息到单个设备,看看是否有效。您可以通过在调试中启动应用程序来获取InstanceId,并在“FirebaseInstanceIdService”上放置一个断点。 –

+0

我没有看到在firebase.google.com/docs的快速谷歌搜索中显示的“api标记”。你的意思是“ID令牌”?或“身份验证令牌”?或者你是在谈论头部提供的我的授权密钥?这一点很好:如果我改变它,服务器响应切换到“未授权”,而不是我正在获取的错误消息。 – Anders8

+0

该博客似乎是关于向特定设备发送消息,而不是像原始讨论一样,只是将其发送给应用的所有用户。 – Anders8

回答

43

Firebase通知没有API发送消息。幸运的是,它建立在Firebase云消息传递的基础之上,Firebase云消息传递正是这样一个API。

随着火力地堡声明和云信息,您可以通过三种方式发送所谓的下行消息到设备:

  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!", 
    } 
} 
+0

我尝试提交{“to”:“/ topic/allDevices”,“data”:{“message”:“这是Firebase云消息传递主题消息!“}}并收到相同的InvalidRegistration响应。我会认为这意味着这个话题是无效的。我没有办法在控制台中查看主题数据库。 – Anders8

+3

'/ topics /'是复数 –

+0

*傻笑*哦,错字,程序员的祸根。 ;)新的回应是:{“message_id”:5115052numbers95180}当然看起来更成功。因此,听起来底线是,尽管管理控制台中有一个通过“通知”发送通知的电源功能,但没有办法从API提交中触发此功能,并且应该将自己转换为使用邮件。 (丢失通知中内置的计划和转换跟踪)我将查找消息代码来处理接收。谢谢弗兰克。 :) – Anders8

-6

您可以用通知发送到所有设备“/主题/ 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!", 
    } 
} 
+0

这是新功能吗?或者这是否需要应用程序订阅“全部”? – Anders8

+0

它是默认功能。我不订阅任何主题。它为我工作。但我做了令牌注册。 “getToken” – sivakg2000

+0

这不起作用,据我所知 –

3

的一种方法是让所有您的用户设备订阅了一个主题。通过这种方式,当您将消息定位到特定主题时,所有设备都会获得该消息。我想这是Firebase控制台中的通知部分如何实现的。

+0

阅读此blogpost了解更多详情 - > http://developine.com/how-to-send-firebase-push-notifications-from-app-server-tutorial/ –

4

我想出了将推送通知发送给所有设备的最简单方法是将它们订阅到“全部”主题,然后发送通知给此主题。 拷贝在主要活动

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

现在发送请求作为

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

这可能是低效或非标准的方式,但正如我上面提到的这是最简单的。如果您有更好的方式发送推送通知到全部设备,请发邮件。

如果你是新来发送使用火力地堡云端通讯Tutorial - Push Notifications using FCM

+0

这对我来说很有意义。但是和你一样,我不确定它是否低效。请有人澄清一下吗? – JCarlos

+1

我不认为它效率低下,这可能是向所有设备发送推送通知的唯一可能方式(至少我找不到任何其他方式) –

相关问题