1

Apple デバイスにバッチで通知を送信したい (たとえば、バッチで 1.000 デバイス トークン)。メッセージが 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(...)

エラーが発生することはありません。接続がまだ機能していることを確認する方法はありますか?

2 つ目の問題は、ssl.write と APN からの Ready エラー応答の間の遅延です。最後のメッセージが送信された後、タイムアウト パラメータを IO.select に渡すことができます。たぶん、1.000 バッチを数秒間待つのは問題ありませんが、異なる bundle_id に対して 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(...)

注意すべき問題の 1 つは、Apple がすぐに応答しない可能性があり、通知の失敗とソケットからの読み取りの間に送信された通知が失われることです。

https://github.com/SymmetricInfinity/grocer/blob/master/lib/grocer/connection.rb#L30で、本番環境で使用しているコードを確認できます。

于 2013-12-12T19:47:52.820 に答える