Ram Laxman Yadav bio photo

Ram Laxman Yadav

Ruby on Rails Developer

Email Twitter LinkedIn Github Stackoverflow

How ever in practice we need to send push based notifications on ios devices from the rails application.

For this purpose you can use grocer ruby gem. Here is sample implementation for this:

Install Gem

  • Write gem 'grocer' in you gem file and run bundle install or just run gem install grocer.

Create a yml for notification

  • Create a yml file in config folder on app for settings
development:
  pem_file: YOUR_PEM_FILE_NAME_WITH_ABSOLUTE_LOCATION
  gateway: 'gateway.sandbox.push.apple.com'
  passphrase: 'YOUR_PASS_PHASE'
  port: 2195
  retries: 3
  
test:
  pem_file: YOUR_PEM_FILE_NAME_WITH_ABSOLUTE_LOCATION
  gateway: 'gateway.sandbox.push.apple.com'
  passphrase: 'YOUR_PASS_PHASE'
  port: 2195
  retries: 3

staging:
  pem_file: YOUR_PEM_FILE_NAME_WITH_ABSOLUTE_LOCATION
  gateway: 'gateway.push.apple.com'
  passphrase: 'YOUR_PASS_PHASE'
  port: 2195
  retries: 3

production:
  pem_file: YOUR_PEM_FILE_NAME_WITH_ABSOLUTE_LOCATION
  gateway: 'gateway.push.apple.com'
  passphrase: 'YOUR_PASS_PHASE'
  port: 2195
  retries: 3

Creating Class for Notification

  • Create a file in app\config\initializers\, say user_notifications.rb.
  • Add following lines of code inside user_notifications.rb
require 'singleton'
 
class UserNotification
  include Singleton

  def initialize
    options = YAML.load_file(File.join(Rails.root, 'config', 'apn_settings.yml'))[Rails.env]
    passphrase = options.delete('passphrase')
    gateway = options.delete('gateway')
    port = options.delete('port')
    retries = options.delete('retries')
    _pem_file = options.delete('pem_file')
    @pusher ||= Grocer.pusher(
        certificate: _pem_file,
        passphrase: passphrase,
        gateway: gateway,
        port: port,
        retries: retries
    )
  end

  def send_notification(options)
    puts "------ sending notification on #{options[:device_token]}"
    notification = Grocer::Notification.new(
        device_token: options[:device_token],
        alert: options[:message],
        badge: 42,
        sound: 'siren.aiff'
    )
    @pusher.push(notification)
  end

end

Send Notification

UserNotification.instance.send_notification({
                                                        device_token: DEVICE_TOKEN_FOR_DEVICE,
                                                        message: YOUR_NOTIFICATION_MESSAGE
                                                    })

Enjoy!!!!