使用Ruby向Firebase发送通知

3

我正在使用 Ruby 版本 1.8.7。

我使用这个FCM宝石 https://github.com/spacialdb/fcm ,想要向 Android 客户端应用程序发送通知消息,但是它没有起作用。

在控制器中:

fcm = FCM.new(FIREBASE_API_KEY, :timeout => 30)
 options = {:data => {:message => "This is a FCM Topic Message!"}}
 response = fcm.send_to_topic('global', options)

类FCM:

require 'httparty'
require 'cgi'
require 'json'

class FCM
  include HTTParty
  base_uri 'https://fcm.googleapis.com/fcm'
  default_timeout 30
  format :json

  attr_accessor :timeout, :api_key

  def initialize(api_key, client_options = {})
    @api_key = api_key
    @client_options = client_options
  end

  def send_with_notification_key(notification_key, options = {})
    body = { :to => notification_key }.merge(options)

    params = {
        :body => body.to_json,
        :headers => {
        'Authorization' => "key=#{@api_key}",
        'Content-Type' => 'application/json'
    }
  }

  response = self.class.post('/send', params.merge(@client_options))
  response.parsed_response
  end

  def send_to_topic(topic, options = {})
    if topic =~ /[a-zA-Z0-9\-_.~%]+/
        send_with_notification_key('/topics/' + topic, options)
    end
  end
end
  1. 服务器密钥正确,因为我可以通过PHP代码成功发送通知。
  2. 以下是响应输出: {"message_id"=>8885803884270587181}

请问有人能指出代码出了什么问题吗? 任何帮助都将不胜感激。


响应 = self.class.post('/send', params.merge(@client_options).to_json) 产生 TypeError 错误(无法将字符串转换为哈希)。 - Jimy25
你的代码可以运行,没有错误信息。我不知道你在问什么。 - Tom Lord
FCM类是FCM gem的一部分。很少有可能出现问题。 - Daniel Rikowski
你能发布一下你在Android中处理消息的代码吗? - AL.
我完全按照这个例子操作 http://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/ - Jimy25
显示剩余2条评论
5个回答

3
根据Firebase API文档,您收到的响应是成功排队消息的预期响应。
如果您收到了一个message_id,它代表以下含义:
当FCM成功接收请求并将尝试传递给所有已订阅设备时,它表示主题消息ID。
看起来您的代码正在工作,即问题必须出在其他地方。 编辑:您正在发送数据消息。(因为没有通知键,只有数据键) 也许您的客户端希望收到通知消息?
请查看文档以了解这两种消息类型之间的区别。
您可以尝试添加一个通知键到请求中:
fcm = FCM.new(FIREBASE_API_KEY, :timeout => 30)
options = {:notification => "Test notification", 
           :data => {:message => "This is a FCM Topic Message!"}}
response = fcm.send_to_topic('global', options)

我的Android客户端应用可以在使用PHP代码发送通知时接收到通知,但不能在上述Ruby代码中接收到。 - Jimy25

1
我之前遇到过这个问题。
尝试在FCM类实例化选项中添加 priority: "high"notification: "your message"

0

我不确定这是由于 FCM 本身的更改,但使用宝石文档中的语法或使用丹尼尔答案中的格式对我来说都没有起作用(丹尼尔的版本会从 FCM 获得错误响应,指出通知必须是 JSON 对象)。

这就是对我有效的方法:

fcm.send_to_topic(topic, notification: { body: "topic notification" })

0

很遗憾,fcm库不支持rubies < 2.0。根据存储库的git历史记录,在项目start开始时就已经是这种情况了。


-1

试试这个

 request = HTTParty.post('http://fcm.googleapis.com/fcm/send', :body => { "to" => "#{token}", "priority" => "high", "data" => { "title" =>title,"body"=>message,'massage_type'=>'text'}}.to_json, :headers => { 'Content-Type' => 'application/json', 'Authorization' => "key=#{server_token}" } )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接