Railsでプッシュ通知のfeedbackを取得する

アドウェイズエンジニアのイシマルです。

iPhoneアプリでは、ユーザーの端末にプッシュ通知を送ることができます。

このプッシュ通知ですが、アプリ毎に管理されているので、ユーザーの端末からアプリが消されていると、当然ながら、プッシュ通知は届かなくなります。アプリ側では、端末からアプリが消えているかを把握したいですよね。

今回はRailsで、Push通知関連を行うことができるapn_senderを用いた手法を紹介したいと思います。

■導入

$ vi Gemfile
gem 'apn_sender', git: 'https://github.com/phuongnd08/apn_sender.git', branch: 'master'

$ bundle install

※2013/11/11現在、 gem 'apn_sender'でインストールすると、新しいバージョンのapn_senderになり、Pushを送るメソッド名が変わっているので注意

■プッシュ通知を送るコード
今回は紹介しません。githubのREADMEを見てください。
https://github.com/phuongnd08/apn_sender

■削除したユーザーを取得するコード(feedback)
これも上記のgithubに載っていますが、こちらを紹介したいと思います。

●コード
スクリプト名は何でも良いです。
$ vi ./script/apn_feedback_production.rb

# encoding: utf-8
require 'apn'

opts = {:full_cert_path => "/var/www/project_name/current/config/certs/apn_production.pem"}
feedback = APN::Feedback.new(opts)
#feedback = APN::Feedback.new()

items = feedback.data # => Array of APN::FeedbackItem elements
items.each do |item|
  p [item.token,item.timestamp].join(' ')
  # ... custom logic here
end


$ bundle exec rails r ./script/apn_feedback_production.rb -e production


上のコードでは、標準出力で、
p [item.token,item.timestamp].join(' ')

のように、端末の「device_token」と「AppleのAPNが端末からアプリが消されたと判断した日時」を返すようにしており、以下のような出力になります。

"devicetokendevicetokendevicetokendevicetokendevicetokendeviceto1 2013-11-10 22:14:32 +0900"
"devicetokendevicetokendevicetokendevicetokendevicetokendeviceto2 2013-11-10 22:14:59 +0900"
"devicetokendevicetokendevicetokendevicetokendevicetokendeviceto3 2013-11-10 22:26:44 +0900"

また、このFeedbackのScriptを1時間に1回実行して、出力を確認してみた結果、

blog8_1

上記のように、プッシュ通知を実行した20時30分直後の、21時、22時で多くのFeedbackが取れましたが、それ以降も少しずつFeedbackが取られ、

AppleのAPNが端末からアプリが消されたと判断した日時」は、かなりばらつくようです。

紹介は以上になります。

Appleのプッシュ通知の詳細は、Local NotificationおよびPush Notificationプログラミングガイドを参考にしてください!