Rpush. The push notification service for Ruby.
Supported services:
- Apple Push Notification Service
- Including Safari Push Notifications.
- Google Cloud Messaging
- Amazon Device Messaging
- Windows Phone Push Notification Service
Supported storage backends:
Optional Rails integration (version 3 & 4).
Scales vertically (threading) and horizontally (multiple processes).
Designed for uptime - new apps are loaded automatically, signal
HUP
to update running apps.Run as a daemon or inside an existing process.
Use in a scheduler for low-workload deployments (Push API).
Hooks for fine-grained instrumentation and error handling (Reflection API).
Works with MRI, JRuby and Rubinius.
Getting Started
Add it to your Gemfile:
gem 'rpush'
Initialize Rpush into your project. Rails will be detected automatically.
cd /path/to/project
rpush init
Create an App & Notification
Apple Push Notification Service
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 = "..."
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.
Google Cloud Messaging
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 = ["token", "..."]
n.data = { message: "hi mom!" }
n.save!
GCM also requires you to respond to Canonical IDs.
Amazon Device Messaging
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.
Windows Phone Notification Service
app = Rpush::Wpns::App.new
app.name = "windows_phone_app"
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.alert = "..."
n.save!
Running Rpush
It is recommended to run Rpush as a separate process in most cases, though embedding and manual modes are provided for low-workload environments.
As a daemon (recommended):
cd /path/to/project
rpush start
See rpush help
for all available commands and options.
Embedded inside an existing process
# Call this during startup of your application, for example, by adding it to the end of config/rpush.rb
Rpush.
See Embedding API for more details.
Manually (in a scheduler)
Rpush.push
Rpush.apns_feedback
See Push API for more details.
Configuration
See Configuration for a list of options.
Updating Rpush
You should run rails init
after upgrading Rpush to check for configuration and migration changes.
Wiki
General
- Configuration
- Moving from Rapns
- Deploying to Heroku
- Hot App Updates
- Signals
- Reflection API
- Push API
- Embedding API
- Implementing your own storage backend
- Upgrading from 2.x to 3.0
Apple Push Notification Service
- Generating Certificates
- Advanced APNs Features
- APNs Delivery Failure Handling
- Why open multiple connections to the APNs?
- Silent failures might be dropped connections
Google Cloud Messaging
Contributing
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 mysql
, mysql2
and postgresql
.
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
or :redis
.