Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails: Action Push Native README(翻訳)

概要

MITライセンスに基づいて翻訳・公開いたします。

rails/action_push_native - GitHub

*: このgem名は2025/08/28にAction Native PushからAction Push Nativeにリネームされました(8f7ab36)。

Rails: Action Push Native README(翻訳)

Action Push Nativeは、Railsでモバイルプラットフォーム向けのプッシュ通知を行うgemです。AppleのAPNs(Apple Push Notification Service)と、GoogleのFCM(Firebase Cloud Messaging)をサポートしています。

🔗 インストール方法

bundle add action_push_native
bin/rails g action_push_native:install
bin/rails action_push_native:install:migrations
bin/rails db:migrate

これによりAction Push Native gemがインストールされ、必要なマイグレーションが実行されてデータベースのセットアップが完了します。

🔗 設定ファイル

インストールすると、以下の設定ファイルが作成されます。

  • app/models/application_push_notification.rb
  • app/jobs/application_push_notification_job.rb
  • app/models/application_push_device.rb
  • config/push.yml

app/models/application_push_notification.rbの内容は以下のとおりです。

class ApplicationPushNotification < ActionPushNative::Notification
  # カスタムジョブのqueue_nameを設定する
  queue_as :realtime

  # プッシュ通知を有効にするかどうかの制御
  # デフォルト:!Rails.env.test?
  self.enabled = Rails.env.production?

  # 通知を送信前に変更・中止するためカスタムコールバックを定義する
  before_delivery do |notification|
    throw :abort if Notification.find(notification.context[:notification_id]).expired?
  end
end

上はプッシュ通知の作成と送信に使われます。これをサブクラス化してカスタマイズすることも、直接編集してアプリケーションのデフォルト設定を変更することも可能です。


app/jobs/application_push_notification_job.rbの内容は以下のとおりです。

class ApplicationPushNotificationJob < ActionPushNative::NotificationJob
  # ジョブ引数のログ出力を有効にする(デフォルト: false)
  self.log_arguments = true

  # `Rails.error`レポーターでジョブのリトライを報告する(デフォルト: false)
  self.report_job_retries = true
end

プッシュ通知を処理するジョブクラスです。アプリケーションで直接編集することでカスタマイズできます。


app/models/application_push_device.rbの内容は以下のとおりです。

class ApplicationPushDevice < ActionPushNative::Device
  # TokenErrorの処理をカスタマイズする(デフォルト:destroy!)
  # rescue_from (ActionPushNative::TokenError) { Rails.logger.error("Device #{id} token is invalid") }
end

これはプッシュ通知デバイスを表します。アプリケーションで直接編集することでカスタマイズできます。


config/push.ymlの内容は以下のとおりです。

shared:
  apple:
    # トークン認証のパラメータ
    # 参考: https://developer.apple.com/documentation/usernotifications/establishing-a-token-based-connection-to-apns
    key_id: your_key_id
    encryption_key: <Appleの認証キー>

    team_id: your_apple_team_id
    # 識別子の取得元: https://developer.apple.com/account/resources/identifiers/list
    topic: your.bundle.identifier

  google:
    # Firebaseプロジェクトのサービスアカウントのcredentials
    # 参考: https://firebase.google.com/docs/cloud-messaging/auth-server
    encryption_key: <サービスアカウントのJSONファイル>

    # Firebaseのproject_id
    project_id: your_project_id

このファイルには、利用するプッシュ通知サービスの設定が含まれています。サポートされているプッシュ通知サービスは、apple(APNs)とgoogle(FCM)です。

複数のアプリを設定する場合は、以下の 複数のアプリの設定セクションを参照してください。

🔗 複数のアプリを設定する

さまざまな通知クラスを利用することで、複数のアプリにプッシュ通知を送信できます。
個別の通知クラスは、ApplicationPushNotificationを継承したうえで、サポートされるプラットフォームごとにpush.yml内のキーセットをself.applicationに設定する必要があります。また、必要に応じて push.yml に共有の application オプションを設定することも可能です。

この通知クラスは、そのプラットフォームの基本設定として機能し、その値は、対応するアプリ固有の設定とマージ(および上書き)されます。

以下の例では、CalendarPushNotificationEmailPushNotificationという2つの通知クラスを用いて、calendaremailという2つのアプリを設定しています。

class CalendarPushNotification < ApplicationPushNotification
  self.application = "calendar"

  # カレンダーアプリ用のカスタム通知ロジックをここに書く
end

class EmailPushNotification < ApplicationPushNotification
  self.application = "email"

  # メールアプリ用のカスタム通知ロジックをここに書く
end
shared:
  apple:
    # Appleプラットフォーム用の基本設定
    # これがアプリ固有の設定とマージされる
    application:
      team_id: your_apple_team_id

    calendar:
      # トークン認証パラメータ
      # 参考: https://developer.apple.com/documentation/usernotifications/establishing-a-token-based-connection-to-apns
      key_id: calendar_key_id
      encryption_key: calendar_apple_encryption_key
      # 識別子の取得元: https://developer.apple.com/account/resources/identifiers/list
      topic: calendar.bundle.identifier

    email:
      # トークン認証パラメータ
      # 参考: https://developer.apple.com/documentation/usernotifications/establishing-a-token-based-connection-to-apns
      key_id: email_key_id
      encryption_key: email_apple_encryption_key
      # 識別子の取得元: https://developer.apple.com/account/resources/identifiers/list
      topic: email.bundle.identifier

  google:
    calendar:
      # Firebaseプロジェクトのサービスアカウントのcredentials
      # 参考: https://firebase.google.com/docs/cloud-messaging/auth-server
      encryption_key: calendar_service_account_json_file

      # Firebaseのproject_id
      project_id: calendar_project_id

    email:
      # Firebaseプロジェクトのサービスアカウントのcredentials
      # 参考: https://firebase.google.com/docs/cloud-messaging/auth-server
      encryption_key: email_service_account_json_file

      # Firebaseのproject_id
      project_id: email_project_id

🔗 利用法

🔗 通知の作成とデバイスへの送信を非同期的に行う

device = ApplicationPushDevice.create! \
  name: "iPhone 16",
  token: "6c267f26b173cd9595ae2f6702b1ab560371a60e7c8a9e27419bd0fa4a42e58f",
  platform: "apple"

notification = ApplicationPushNotification.new \
  title: "Hello world!",
  body:  "Welcome to Action Push Native"

notification.deliver_later_to(device)

deliver_later_toメソッドには以下のようにデバイスの配列も渡せます。

notification.deliver_later_to([ device1, device2 ])

deliver_toメソッドで通知を同期的に配信することも可能です。

notification.deliver_to(device)

通知はdeliver_later_toで非同期的に行うことが推奨されます。そうすることで、エラー処理とリトライロジックが確実に動作するようになり、アプリケーションの動作がブロックされることを回避できます。

🔗 アプリケーションのデータ属性

with_dataメソッドを用いてアプリケーションにカスタムデータを送信できます。

notification = ApplicationPushNotification
  .with_data({ badge: "1" })
  .new(title: "Welcome to Action Push Native")

🔗 カスタムのプラットフォームペイロード

通知とともに送信するカスタムのプラットフォームペイロードを設定できます。これは、利用するプラットフォーム固有の追加データを送信する必要がある場合に有用です。

Appleの場合はwith_apple、Googleの場合はwith_googleを指定できます。

notification = ApplicationPushNotification
  .with_apple(category: "observable")
  .with_google(data: { badge: 1 })
  .new(title: "Hello world!")

プラットフォームペイロードは他のフィールドよりも優先されるので、これを利用してデフォルトの振る舞いをオーバーライドできます。

notification = ApplicationPushNotification
  .with_google(android: { notification: { notification_count: nil } })
  .new(title: "Hello world!", body: "Welcome to Action Push Native", badge: 1)

上によって、Googleペイロードのデフォルトのnotification_countbadge)フィールドが設定解除されます。titlebodyはそのまま維持されます。

🔗 サイレント通知

silentメソッドを用いてサイレント通知を作成できます。

notification = ApplicationPushNotification.silent.with_data(id: 1)

これによって、AppleプラットフォームとGoogleプラットフォームの両方でサイレント通知が作成され、両方のプラットフォームでアプリケーションデータフィールドが{ id: 1 }に設定されます。

サイレントプッシュ通知には、titlebodybadgeなど、デバイスに表示される通知をトリガーする可能性のある属性を含められません。

🔗 デバイスをレコードに紐づける

デバイスは、ownerポリモーフィック関連付けを介してアプリケーション内の任意のレコードに関連付け可能です。

  user = User.find_by_email_address("jacopo@37signals.com")

  ApplicationPushDevice.create! \
    name: "iPhone 16",
    token: "6c267f26b173cd9595ae2f6702b1ab560371a60e7c8a9e27419bd0fa4a42e58f",
    platform: "apple",
    owner: user

🔗 before_deliveryコールバック

通知クラスでは、配信時のコールバックをActive Recordと同様のスタイルで定義できます。

たとえば、カスタムの before_delivery ブロックを指定することで、通知を変更またはキャンセルできます。コールバック内ではnotificationオブジェクトにアクセスできます。また、通知コンストラクタに追加の引数を渡すことで、コールバック内でcontextを通じてそのデータにアクセスできます。

  class CalendarPushNotification < ApplicationPushNotification
    before_delivery do |notification|
      throw :abort if Calendar.find(notification.context[:calendar_id]).expired?
    end
  end

  data = { calendar_id: @calendar.id, identity_id: @identity.id }

  notification = CalendarPushNotification
    .with_apple(custom_payload: data)
    .with_google(data: data)
    .new(calendar_id: 123)

  notification.deliver_later_to(device)

🔗 カスタムのDeviceモデルを使う

デフォルトのApplicationPushDeviceモデルがニーズに合わない場合は、以下の条件を満たすカスタムデバイス モデルを作成できます。

  1. ActiveJobでシリアライズ/デシリアライズ可能であること。
  2. tokenメソッドとplatformメソッドに応答すること。
  3. pushメソッドを以下のように実装していること。
class CustomDevice
  # デバイスのカスタム属性やメソッドをここに書く

  def push(notification)
    notification.token = token
    ActionPushNative.service_for(platform, notification).push(notification)
  rescue ActionPushNative::TokenError => error
    # カスタムのトークンエラー処理をここに書く
  end
end

🔗 ActionPushNative::Notificationの属性

属性名 説明
:title 通知のタイトル
:body 通知の本文
:badge アプリのアイコンに表示するバッジの数字
:thread_id 通知をグループ化するときのスレッドid
:sound 通知受信時に再生するサウンド名
:high_priority 通知を優先順位"高"で送信するかどうか(デフォルト: true
:google_data Google固有の通知ペイロード
:apple_data Apple固有の通知ペイロード
:data 全プラットフォームに送信される通知のデータペイロード
** その他の追加属性がコンストラクタに渡されると、すべてcontextハッシュにマージされる

🔗 ファクトリーメソッド

メソッド名 説明
:with_apple Apple固有の通知ペイロードを設定する
:with_google Google固有の通知ペイロードを設定する
:with_data 全プラットフォームに送信される通知のデータペイロードを設定する
:silent デバイスへの表示をトリガーしないサイレント通知を作成する

License

Action Push Native is licensed under MIT.

関連記事

Solid Cache README: DBベースのキャッシュストア(翻訳)

Solid Queue README -- DBベースのActive Jobバックエンド(翻訳)

Solid Cable README: DBベースのAction Cableアダプタ(翻訳)


関連記事

該当する記事がありません。

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。