草庐IT

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

coder 2023-05-08 原文

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

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

就是这样,“到”这个词。 (标题报告 400)我怀疑这与我的 JSON 中没有“to”有关。一个“到”甚至会放什么?我没有定义任何主题,设备也没有注册任何东西。然而,他们仍然能够接收来自 Firebase 管理面板的通知。

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

好的,然后我在这里尝试了解决方案: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 代码表示注册 token 有问题。也许?因为那部分文档是针对消息服务器的。通知服务器是否相同?不清楚。我在其他地方看到该主题可能需要几个小时才能激活。似乎这对于创建新的聊天室来说毫无用处,所以这似乎也不行。

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

底线:有谁知道提供什么 JSON 来向所有运行该应用的设备发送消息以反射(reflect)管理控制台功能?

最佳答案

Firebase 通知没有用于发送消息的 API。幸运的是,它建立在 Firebase Cloud Messaging 之上,而 Firebase Cloud Messaging 正是拥有这样的 API。

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

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

您会注意到,无法显式发送到所有设备。不过,您可以使用其中的每一个来构建此类功能,例如:通过在应用启动时为应用订阅主题(例如 /topics/all)或保留所有设备 ID 的列表,然后将消息发送给所有这些人。

要发送到主题,您的命令中有语法错误。主题以 /topics/ 开头。由于您的代码中没有它,因此服务器将 allDevices 解释为设备 ID。由于它是设备注册 token 的无效格式,因此会引发错误。

来自关于向主题发送消息的文档:

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

关于android - 如何通过 CURL 向所有设备发送 Firebase 通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38237559/

有关android - 如何通过 CURL 向所有设备发送 Firebase 通知?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  7. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  8. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  9. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  10. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

随机推荐