Mobile notifications are great feature for your app, especially when you integrate mobile and desktop solutions. Here's a quick guide how to setup Apple notifications in your Ruby on Rails project.
I assume you already have these:
Apple certificate for your application
Rails app or API user interface implemented
For production: any tool set for managing background jobs
Houston - gem for sending push notifications
Easy to implement
Provides integration with background jobs
Allows testing notifications from the command line
Documentation does not cover some use cases (i.e. Safari push notifications)
Add Houston gem to your Gemfile:
gem 'houston'
Run bundle install. Houston comes with Apple Push Notification binary which provides testing notifications from the command line.
If you don’t have it yet - create a Device model which will store users’ unique device id (uuid) in the database.
[code]
Add a migration for the Device model. Column `uuid` and references to user table are required in our case, the rest depends on your specifications.
[code]
Run the migration.
You’ll also need to prepare an action in which the user’s device will be created and saved to the database. You could do it when user registers or the mobile app calls to some API endpoint.
To create the device object, we’ll use SecureRandom.uuid method:
Device.create(user: user_id, uuid: SecureRandom.uuid)
If you’re using environment variables, Houston will read them automatically, so you can add APN_CERTIFICATE and APN_CERTIFICATE_PASSPHRASE to your config file.
See more configuration options in this section: https://github.com/nomad/houston#configuration.
If you’re using AppConfig to store variables, you can define them on initializing APN connection. Here’s an example snippet:
[code]
Notice the environment option:
Houston::Client.development
Houston::Client.production
It’s time to create the Notification that will alert a “Hello, World!” message to our user.
notification = Houston::Notification.new(device: token)
notification.alert = "Hello, World!"
There are several options from which you can choose when creating a custom notification:
notification.alert = "Hello, World! |
set alert message | |
notification.badge = 57 |
change a badge count | |
notification.sound = "sosumi.aiff" |
custom notification sound | |
notification.category = "INVITE_CATEGORY" |
add a category identifier | |
notification.content_available = true |
indicate available Newsstand content | |
notification.custom_data = {foo: "bar"} |
pass custom data |
If you want to alert user without sound effect, you have to set sound to an empty string:
Houston::Notification.new(:sound => '', :content_available => true)
For more options, head over to Houston Github page.
Everything looks good, so now, using APN method defined in step 4, we can invoke the action that will send a push notification to your device:
apn.push(notification)
Important note: if you want to test receiving the notification on your device - make sure your your app is in background or closed, otherwise the message won’t show up on your screen.
You can also test if the notifications are working from the included command line apn method.
Use APN push method with your device uuid as and argument and define
-c path_to_your_certificate and -m “your message”
$ apn push "<uuid>" -c /path/to/apple_push_notification.pem -m "Hello from the command line! "
Apple encourages using a queued background job over synchronous connection to their servers. That is why, Houston allows us to establish a persistent connection to their servers.
You could create your background job this way:
[code]
Notice the APPLE_PRODUCTION_GATEWAY_URI used to establish a connection.
Again - you can also connect to the development gateway:
Houston::APPLE_DEVELOPMENT_GATEWAY_URI
Thanks for reaching to the end! I hope my guide will be helpful in your development efforts. To sum up, during this tutorial you have learned:
How to prepare your application for managing user unique devices
How to setup Houston for sending push notifications to Apple devices
How to schedule sending notifications in a background job