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.rbapp/jobs/application_push_notification_job.rbapp/models/application_push_device.rbconfig/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: <%= Rails.application.credentials.dig(:action_push_native, :apns, :key_id) %>
    encryption_key: <%= Rails.application.credentials.dig(:action_push_native, :apns, :encryption_key)&.dump %>
    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: <%= Rails.application.credentials.dig(:action_push_native, :fcm, :encryption_key)&.dump %>
    # Firebaseのproject_id
    project_id: your_project_id
このファイルには、利用するプッシュ通知サービスの設定が含まれています。サポートされているプッシュ通知サービスは、apple(APNs)とgoogle(FCM)です。
複数のアプリを設定する場合は、以下の 複数のアプリの設定セクションを参照してください。
🔗 複数のアプリを設定する
さまざまな通知クラスを利用することで、複数のアプリにプッシュ通知を送信できます。
個別の通知クラスは、ApplicationPushNotificationを継承したうえで、サポートされるプラットフォームごとにpush.yml内のキーセットをself.applicationに設定する必要があります。また、必要に応じて push.yml に共有の application オプションを設定することも可能です。
この通知クラスは、そのプラットフォームの基本設定として機能し、その値は、対応するアプリ固有の設定とマージ(および上書き)されます。
以下の例では、CalendarPushNotificationと EmailPushNotificationという2つの通知クラスを用いて、calendarとemailという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: <%= Rails.application.credentials.dig(:action_push_native, :apns, :calendar, :key_id) %>
      encryption_key: <%= Rails.application.credentials.dig(:action_push_native, :apns, :calendar, :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: <%= Rails.application.credentials.dig(:action_push_native, :apns, :email, :key_id) %>
      encryption_key: <%= Rails.application.credentials.dig(:action_push_native, :apns, :email, :encryption_key)&.dump %>
      # 識別子の取得元: 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: <%= Rails.application.credentials.dig(:action_push_native, :fcm, :calendar, :encryption_key)&.dump %>
      # Firebaseのproject_id
      project_id: calendar_project_id
    email:
      # Firebaseプロジェクトのサービスアカウントのcredentials
      # 参考: https://firebase.google.com/docs/cloud-messaging/auth-server
      encryption_key: <%= Rails.application.credentials.dig(:action_push_native, :fcm, :email, :encryption_key)&.dump %>
      # 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(aps: { category: "observable", "thread-id": "greeting"}, "apns-priority": "1")
  .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_count(badge)フィールドが設定解除されます。titleとbodyはそのまま維持されます。
🔗 サイレント通知
silentメソッドを用いてサイレント通知を作成できます。
notification = ApplicationPushNotification.silent.with_data(id: 1).new
これによって、AppleプラットフォームとGoogleプラットフォームの両方でサイレント通知が作成され、両方のプラットフォームでアプリケーションデータフィールドが{ id: 1 }に設定されます。
サイレントプッシュ通知には、titleやbodyやbadgeなど、デバイスに表示される通知をトリガーする可能性のある属性を含められません。
🔗 デバイスをレコードに紐づける
デバイスは、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(data)
    .with_google(data: data)
    .new(calendar_id: 123)
  notification.deliver_later_to(device)
🔗 カスタムのDeviceモデルを使う
デフォルトのApplicationPushDeviceモデルがニーズに合わない場合は、以下の条件を満たすカスタムデバイス モデルを作成できます。
ActiveJobでシリアライズ/デシリアライズ可能であること。tokenメソッドとplatformメソッドに応答すること。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固有の通知ペイロード。APNリクエストヘッダ(apns-push-typeやapns-priorityなど)を上書きするのにも使えます。 | 
:data | 
全プラットフォームに送信される通知のデータペイロード | 
| ** | その他の追加属性がコンストラクタに渡されると、すべてcontextハッシュにマージされる | 
🔗 ファクトリーメソッド
| メソッド名 | 説明 | 
|---|---|
:with_apple | 
Apple固有の通知ペイロードを設定する | 
:with_google | 
Google固有の通知ペイロードを設定する。APNリクエストヘッダ(apns-push-typeやapns-priorityなど)を上書きするのにも使えます。 | 
:with_data | 
全プラットフォームに送信される通知のデータペイロードを設定する | 
:silent | 
デバイスへの表示をトリガーしないサイレント通知を作成する | 
License
Action Push Native is licensed under MIT.
      
概要
MITライセンスに基づいて翻訳・公開いたします。
*注: このgem名は2025/08/28にAction Native PushからAction Push Nativeにリネームされました(8f7ab36)。