我正在使用 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
我如何知道这些未注册设备的令牌,以便将它们从我的数据库中删除?