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