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
オプションを設定することも可能です。
この通知クラスは、そのプラットフォームの基本設定として機能し、その値は、対応するアプリ固有の設定とマージ(および上書き)されます。
以下の例では、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: 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_count
(badge
)フィールドが設定解除されます。title
とbody
はそのまま維持されます。
🔗 サイレント通知
silent
メソッドを用いてサイレント通知を作成できます。
notification = ApplicationPushNotification.silent.with_data(id: 1)
これによって、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(custom_payload: 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固有の通知ペイロード |
:data |
全プラットフォームに送信される通知のデータペイロード |
** | その他の追加属性がコンストラクタに渡されると、すべてcontext ハッシュにマージされる |
🔗 ファクトリーメソッド
メソッド名 | 説明 |
---|---|
:with_apple |
Apple固有の通知ペイロードを設定する |
:with_google |
Google固有の通知ペイロードを設定する |
:with_data |
全プラットフォームに送信される通知のデータペイロードを設定する |
:silent |
デバイスへの表示をトリガーしないサイレント通知を作成する |
License
Action Push Native is licensed under MIT.
概要
MITライセンスに基づいて翻訳・公開いたします。
*注: このgem名は2025/08/28にAction Native PushからAction Push Nativeにリネームされました(8f7ab36)。