Rpush aims to be the de facto gem for sending push notifications in Ruby. Its core goals are ease of use, reliability and a rich feature set. Rpush provides numerous advanced features not found in others gems, giving you greater control & insight as your project grows. These are a few of the reasons why companies worldwide rely on Rpush to deliver their notifications.
- Apple Push Notification Service
- Including Safari Push Notifications.
- Google Cloud Messaging
- Amazon Device Messaging
- Windows Phone Push Notification Service
- Use ActiveRecord, Redis or MongoDB for storage.
- Plugins for Bugsnag, Sentry, StatsD or write your own.
- Seamless integration with your projects, including Rails.
- Run as a daemon, inside a job queue, on the command-line or embedded in another process.
- Scales vertically (threading) and horizontally (multiple processes).
- Designed for uptime - new apps are loaded automatically, signal
HUP
to update running apps. - Hooks for fine-grained instrumentation and error handling (Reflection API).
- Works with MRI, JRuby and Rubinius.
Add it to your Gemfile:
gem 'rpush'
Initialize Rpush into your project. Rails will be detected automatically.
$ cd /path/to/project
$ rpush init
If this is your first time using the APNs, you will need to generate SSL certificates. See Generating Certificates for instructions.
app = Rpush::Apns::App.new
app.name = "ios_app"
app.certificate = File.read("/path/to/sandbox.pem")
app.environment = "sandbox" # APNs environment.
app.password = "certificate password"
app.connections = 1
app.save!
n = Rpush::Apns::Notification.new
n.app = Rpush::Apns::App.find_by_name("ios_app")
n.device_token = "..." # 64-character hex string
n.alert = "hi mom!"
n.data = { foo: :bar }
n.save!
The url_args
attribute is available for Safari Push Notifications.
You should also implement the ssl_certificate_will_expire reflection to monitor when your certificate is due to expire.
app = Rpush::Gcm::App.new
app.name = "android_app"
app.auth_key = "..."
app.connections = 1
app.save!
n = Rpush::Gcm::Notification.new
n.app = Rpush::Gcm::App.find_by_name("android_app")
n.registration_ids = ["..."]
n.data = { message: "hi mom!" }
n.save!
GCM also requires you to respond to Canonical IDs.
app = Rpush::Adm::App.new
app.name = "kindle_app"
app.client_id = "..."
app.client_secret = "..."
app.connections = 1
app.save!
n = Rpush::Adm::Notification.new
n.app = Rpush::Adm::App.find_by_name("kindle_app")
n.registration_ids = ["..."]
n.data = { message: "hi mom!"}
n.collapse_key = "Optional consolidationKey"
n.save!
For more documentation on ADM.
app = Rpush::Wpns::App.new
app.name = "windows_phone_app"
app.client_id = # Get this from your apps dashboard https://dev.windows.com
app.client_secret = # Get this from your apps dashboard https://dev.windows.com
app.connections = 1
app.save!
n = Rpush::Wpns::Notification.new
n.app = Rpush::Wpns::App.find_by_name("windows_phone_app")
n.uri = "http://..."
n.data = {title:"MyApp", body:"Hello world", param:"user_param1"}
n.save!
It is recommended to run Rpush as a separate process in most cases, though embedding and manual modes are provided for low-workload environments.
See rpush help
for all available commands and options.
$ cd /path/to/project
$ rpush start
$ rpush push
Rpush will deliver all pending notifications and then exit.
Rpush.push
Rpush.apns_feedback
See Push API for more details.
if defined?(Rails)
ActiveSupport.on_load(:after_initialize) do
Rpush.embed
end
else
Rpush.embed
end
Call this during startup of your application, for example, by adding it to the end of config/rpush.rb
. See Embedding API for more details.
If you're using mina, there is a gem called mina-rpush which helps you control rpush.
See Configuration for a list of options.
You should run rpush init
after upgrading Rpush to check for configuration and migration changes.
- Using Redis
- Using ActiveRecord
- Configuration
- Moving from Rapns
- Deploying to Heroku
- Hot App Updates
- Signals
- Reflection API
- Push API
- Embedding API
- Writing a Plugin
- Implementing your own storage backend
- Upgrading from 2.x to 3.0
- Generating Certificates
- Advanced APNs Features
- APNs Delivery Failure Handling
- Why open multiple connections to the APNs?
- Silent failures might be dropped connections
When running specs, please note that the ActiveRecord adapter can be changed by setting the ADAPTER
environment variable. For example: ADAPTER=postgresql rake
.
Available adapters for testing are postgresql
, jdbcpostgresql
, mysql2
, jdbcmysql
, jdbch2
, and sqlite3
.
Note that the database username is changed at runtime to be the currently logged in user's name. So if you're testing with mysql and you're using a user named 'bob', you will need to grant a mysql user 'bob' access to the 'rpush_test' mysql database.
To switch between ActiveRecord and Redis, set the CLIENT
environment variable to either active_record
, redis
or mongoid
.