红宝石中的APN错误处理

时间:2013-07-09 18:14:03

标签: ruby apple-push-notifications tcpsocket

我想批量发送通知给苹果设备(例如批量生成1.000个设备令牌)。 Ant似乎我无法确定消息是否已传递给APN。

以下是代码示例:

ssl_connection(bundle_id) do |ssl, socket|
  device_tokens.each do |device_token|
    ssl.write(apn_message_for device_token)

    # I can check if there is an error response from APNs
    response_has_an_error = IO.select([socket],nil,nil,0) != nil
    # ...
  end
end

主要问题是在建立ssl_connection后网络是否已关闭

ssl.write(...)

绝不会引发错误。有没有办法让ckeck连接仍然有效?

第二个问题是ssl.write和来自APN的就绪错误答案之间的延迟。在发送最后一个messege后,我可以将超时参数传递给IO.select。也许可以等待几秒钟以获得1.000批次,但是如果我必须为不同的bundle_ids发送1.000条消息,那么可以吗?

1 个答案:

答案 0 :(得分:2)

https://zeropush.com,我们使用名为grocer的宝石来处理我们与Apple的沟通,我们遇到了类似的问题。我们找到的解决方案是在每次写入之前使用套接字的read_non_block方法来检查套接字上的传入数据,这将指示错误。

它使逻辑变得有趣,因为如果没有要读取的数据,read_non_block会抛出IO::WaitReadable。因此,在继续正常之前,我们会调用read_non_block并抓住IO::WaitReadable。在我们的例子中,捕获异常是一个快乐的案例。您可以使用类似的方法,而不是使用IO.select(...)

需要注意的一个问题是Apple可能不会立即响应,并且在失败的通知和从套接字读取之间发送的任何通知都将丢失。

您可以在https://github.com/SymmetricInfinity/grocer/blob/master/lib/grocer/connection.rb#L30看到我们在制作中使用的代码。