🔔
RailsでFirebase Cloud Messaging(FCM)を使ってプッシュ通知を送信する
概要
流れ
- 登録トークンを取得する
- 取得したトークンを使って送信処理(FCM HTTP v1 API を使用)
- 登録トークンを指定しての送信(1 件ずつ送信)
- トピックへの送信(複数の対象への送信)
注意点
記事中に登場する、{プロジェクトID}
のような中括弧で囲んだ項目は、中身をその場所に展開することを指すことにします。実際には中括弧は不要です。
登録トークンの取得(アプリ側)
登録トークンとは
FCM がアプリ インスタンスを一意に識別するためのトークン。プッシュ通知を受け取るアプリ側で設定を行う。
登録トークンの取得
- iOS
- Android
- C++
- JavaScript
- その他
- 「Firebase Registration token (フレームワーク名)」等で検索するとパッケージが見つかるかもしれません
Firebase コンソール側での準備(認証情報の設定)
- プロジェクトを設定 → サービスアカウント → Firebase Admin SDK → 新しい秘密鍵の生成 → キー生成
- 名前をつけて保存(例:service_account_json_key.json)
- 参考
OAuth 2.0 アクセストークンの取得(Rails 側)
-
googleauth
gem を使用
scope = 'https://www.googleapis.com/auth/firebase.messaging'
authorizer = Google::Auth::ServiceAccountCredentials.make_creds( json_key_io: File.open('/path/to/service_account_json_key.json'), scope: scope)
authorizer.fetch_access_token!
登録トークンを指定して送信(Rails 側)
POST https://fcm.googleapis.com/v1/projects/{プロジェクトID}/messages:send
- Header
- Authorization
Bearer {OAuth2.0 アクセストークン}
- Content-Type
application/json
- Body
- Authorization
{
"message":{
"token":"{登録トークン}",
"notification":{
"body":"This is an FCM notification message!",
"title":"FCM Message"
}
}
}
- プロジェクト ID の取得
- 設定 → 全般 → プロジェクト ID
- 例
uri = URI.parse("https://fcm.googleapis.com/v1/projects/{プロジェクトID}/messages:send")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
req = Net::HTTP::Post.new(uri.request_uri)
req['Authorization'] = "Bearer #{access_token['access_token']}"
req['Content-Type'] = "application/json"
req.body = body
res = http.request(req)
トピックへ登録トークンを紐づける(Rails 側)
POST https://iid.googleapis.com/iid/v1/{登録トークン}/rel/topics/{トピック名}
- Header
- Authorization
key={サーバーキー}
- サーバーキーは、プロジェクトを設定 → Cloud Messaging → サーバーキー から取得
- Authorization
トピックへ送信(Rails 側)
POST https://fcm.googleapis.com/v1/projects/{プロジェクトID}/messages:send
- Header
- Authorization
Bearer {OAuth2.0 アクセストークン}
- Body
- Authorization
{
"message" : {
"topic" : "{トピック名}",
"notification" : {
"title" : "title test",
"body" : "topic test"
}
}
}
注意点
- トピックへ登録トークンを紐づける API と、通知を送信する API で認証の方法が違うので気をつけてください
Discussion