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

时间:2016-07-07 04:30:36

标签: 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"
    }
}

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

就是这样,“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来向运行应用程序的所有设备发送消息以镜像管理控制台功能?

10 个答案:

答案 0 :(得分:70)

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

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

  1. to specific devices,如果您知道他们的设备ID
  2. to groups of devices,如果您知道群组的注册ID
  3. to topics,它们只是设备可以订阅的密钥
  4. 您会注意到无法明确发送到所有设备。您可以使用这些功能构建此类功能。

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

答案 1 :(得分:51)

我想出的将推送通知发送到所有设备的最简单方法是订阅他们的主题" 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

答案 2 :(得分:8)

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

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

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

答案 3 :(得分:4)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

感谢Syed Rafay的回答。

app.component.ts

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

服务器文件

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

答案 6 :(得分:0)

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

  1. 转到Firebase控制台

  2. 从侧面菜单中单击增长

  3. 单击 Cloud Messaging

  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",
);

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

答案 7 :(得分:0)

对于想知道如何在 cordova 混合应用程序中执行此操作的任何人:

  • 转到 index.js -> 函数内的 onDeviceReady() 写:

      subscribe();
    

(写在函数顶部很重要!)

  • 然后,在同一个文件(index.js)中找到:

    函数订阅(){

     FirebasePlugin.subscribe("write_here_your_topic", function(){
    
     },function(error){
    
         logError("Failed to subscribe to topic", error);
     });
     }
    

并在此处写下您自己的主题 -> "write_here_your_topic"

答案 8 :(得分:-3)

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

匿名>>>>>已启用

enter image description here

答案 9 :(得分:-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!",
   }
}