Firebase Cloud Messaging(FCM)でPush通知の実装(Ruby)
要件
Firebase Cloud Messaging(FCM)でPush通知の実装を行います(Ruby)
アプリ開発を初めて行った時、「Push通知はどうやって実装するんだろう」とさっぱり分かりませんでしたが、サーバーサイド(Ruby)からFCMにRequestする方法をご紹介します。
料金
Firebase Cloud Messaging(FCM)がPush通知に該当する箇所ですが、FirebaseをPush通知だけで利用するのであれば、無料で利用できます。
FCMアーキテクチャ
本記事では赤枠部分のFCMへのインタフェースを実装しています。
実装解説
(1) ユーザーがログイン時、会員登録時など、DeviceTokenをアプリからサーバーサイドに送信し、データベースに保存しておく必要があります。
iOSの実装例は多数のブログがありますので、ここでは割愛します。
(2) FCMクライアントを初期化します。
(3) オプションの設定をします。
いくつかポイントとなるオプションだけご紹介します。
sound サウンドファイルを用意すれば、Push通知の音を自由に変更できます。
badge ホームアイコンの右肩にあるバッチの件数を設定できます。
show_in_foreground アプリがフォアグランドにある場合も通知を表示できる(ただし全ての通知が表示されるためアプリ側で通知の表示を判定したい場合は使えない)
その他オプションは、2番目の引数を介して、dataやtime_to_liveなどのHTTP Message パラメータをハッシュとして送信することができます。
パラメータの種類はこちらをご確認ください。
(4) DeviceTokenの配列をFCMクライアントに渡して、送信します。
require 'fcm'
require 'dotenv'
Dotenv.load
class PushNotification
def initialize
@registration_ids = []
@fcm = FCM.new("#{ENV['FCM_SERVER_KEY']}")
end
def direct_messsage(sender, receiver)
message = "#{sender.name}さんからメッセージが届いています!"
fetch_device_tokens(receiver)
fcm_send!(receiver, message)
end
private
def fcm_send!(user, message)
if @registration_ids
options = {
priority: 'high',
notification: {
body: message,
sound: 'push_sound.wav',
badge: user.unread_messages_count,
},
data: {
show_in_foreground: true,
message: message,
}
}
response = @fcm.send(@registration_ids, options)
Rails.logger.info "== push_notification_sent_to: #{@registration_ids} =="
Rails.logger.info "== push_notification_response: #{response} =="
else
Rails.logger.info "== We didn't send the push notification. =="
end
end
def fetch_device_tokens(user)
user && user.push_notification_devices && user.push_notification_devices.each do |device|
@registration_ids << device.token
end
end
end
まとめ
サーバーサイドでFCMへのインタフェースを用意し、Push通知を送る方法を試してみました。
なお、Ruby committerの方が、andpushというFCMのクライアントgemを提供しています。
gem fcmより優れているようですが、コードを書いた後にandpushの存在を知ったので、ここではgem fcmを使っています。
ご興味がある方は以下をご参照ください。
gem andpush