我想批量发送通知给苹果设备(例如批量生成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条消息,那么可以吗?
答案 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看到我们在制作中使用的代码。