1

我正在使用 rapns 来提供 GCM 和 APNS 支持。对于 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

0

我正在使用 rapns 做几乎相同的事情,所以这里有我的两分钱:

首先,对于 Android 设备,您不需要 device_token 来停用/删除设备(在 GCM device_token == registration_id 上)。on.notification_failed您可以使用反射 API从回调中获取该registration_id 。

最后,您使用的是哪个版本的 rapns?现在最后一个版本(3.4.1)有一个错误on.notification_failed,但版本 3.3.2 工作得很好,你可以做类似的事情:

on.notification_failed do |notification|
  device = Device.find_by_token(notification.registration_ids.first)
  device.destroy if device
end

希望有帮助。

于 2013-09-05T21:13:51.343 回答