1

我想批量发送通知到苹果设备(例如批量 1.000 个设备令牌)。Ant 似乎我无法确定该消息已传递到 APNs。

这是代码示例:

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(...)

永远不会引发错误。有什么方法可以检查该连接是否仍然有效?

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

4

1 回答 1

2

https://zeropush.com,我们使用名为 grocer 的 gem 来处理我们与 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看到我们在生产中使用的代码。

于 2013-12-12T19:47:52.820 回答