1

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

データベースから削除できるように、これらの未登録デバイスのトークンを知るにはどうすればよいですか?

4

1 に答える 1