GCM と APNS のサポートを提供するために rapns を使用しています。APNS の場合、on.apns_feedback (rapns.rb) を介して削除する必要がある未登録のデバイスを知っています。
on.apns_feedback do |feedback|
device = AppleDevice.find_by_token(feedback.device_token)
device.destroy if device
end
しかし、GCM の場合、どのデバイスが登録解除されているかを知る方法が見つからないため、データベースから削除できます。
リフレクション API を試してみましたが、Rapns::DeliveryError 例外が発生するたびに on.notification_failed と on.error が呼び出されず、これらのメソッドでは未登録のトークンを知る方法がないようです。
Rapns::DeliveryError をキャッチしようとしましたが、うまくいかないようです。
messenger = PushMessenger::Gcm.new
GoogleDevice.find_in_batches :batch_size => 1000 do |devices|
tokens = devices.map(&:token)
begin
messenger.deliver(app, tokens, payload, nil, true)
rescue Rapns::DeliveryError => error
GoogleDevice.destroy_all # Just to see it works
end
end
プッシュメッセンジャー:
module PushMessenger
class Gcm
def deliver(app, tokens, payload, collapse_key=nil, delay_while_idle=nil, expiry=1.day.to_i)
tokens = *tokens
n = Rapns::Gcm::Notification.new
n.app = app
n.registration_ids = tokens
n.collapse_key = collapse_key
n.delay_while_idle = delay_while_idle
n.expiry = expiry
n.data = payload
n.save!
end
end
end
データベースから削除できるように、これらの未登録デバイスのトークンを知るにはどうすればよいですか?