apn_sender and Rails 3

白昼怎懂夜的黑 提交于 2019-12-05 12:49:43

Rails 3 and apn_sender

I too have been working on the apn_sender problem, because I like that the Apple Push Notification support seems pretty robust. However, the project has been abandoned and now it is falling behind the latest 3 series rails. I have gotten the system working as follows.

Gemfile

gem 'apn_sender', :require => 'apn'
gem 'daemons'
gem 'resque', '1.20.0'
gem 'resque-access_worker_from_job'

The signal handling changed in Resque after 1.20 so you must use the older 1.20.0. Daemons should have been a requirement all along but was never explicitly in the gem spec.

script/apn_sender

#!/usr/bin/env ruby

# Daemons sets pwd to /, so we have to explicitly set RAILS_ROOT
RAILS_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))

require 'rubygems'
require 'apn'
require 'apn/sender_daemon'

APN::SenderDaemon.new(ARGV).daemonize

Retrieved this from here. The reason the apn_sender script is not generated is because the generator script needs to be updated for 3 series rails.

Starting the sender

./script/apn_sender --environment=production --verbose start

When starting the environment the production value is probably what you want since both ad_hoc and release versions are using the production certificate.

This fork on github has corrected some of the rails 3 issues, but the resque version problem still needs to be resolved explicitly.

Manually testing

This website shows how to send messages bypassing the daemon. He stores the tokens as base64 encoded strings which is nice and compact. The format of a device string in the apn_sender framework is a hex string formatted like this: deadbeef 0a1b2cdf deadbeef 0a1b2cdf deadbeef 0a1b2cdf deadbeef 0a1b2cdf. Spaces optional.

require 'base64'
ios_device_token = User.where(username: 'Cameron').first.ios_device_token
token = Base64.decode64(ios_device_token).unpack('H*').first.scan(/\w{8}/).join(' ')
notification = APN::Notification.new(token, { alert: 'Hello, World!', sound: true, badge: 99 })
sender = APN::Sender.new(verbose: true, environment: 'production')
sender.send_to_apple(notification)

Make sure the feedback.rb file is up-to-date

# Unpacking code borrowed from http://github.com/jpoz/APNS/blob/master/lib/apns/core.rb
while bunch = socket.read(38)   # Read data from the socket
  f = bunch.strip.unpack('N1n1H140')
  feedback << APN::FeedbackItem.new(Time.at(f[0]), f[2])
end

One version of the code lacked 38 and it resulted in bad token strings being returned from the feedback service

RubyMine by JetBrains

If you plan on taking Ruby development to the next level you should also consider an IDE like RubyMine because it makes everything so much easier.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!