私たちは毎日何百万もの APNS 通知を送信しているため、一人称視点で話をしたいと思いました.
残念ながら、@Eran の引用は、Apple が APNS ソケットを管理する方法について私たちが持っている最高のリソースに関するものです。ボリュームが少ない場合は問題ありませんが、Apple のドキュメント全体は、カジュアルでボリュームの少ない開発者向けに大きく偏っています。スケールすると、文書化されていない動作がたくさん表示されます。
エラー検出を非同期で行うことに関するそのドキュメントの部分は、高スループットにとって重要です。送信ごとにエラーをブロックすることを主張する場合は、スループットを維持するためにワーカーを大幅に並列化する必要があります。ただし、推奨される方法は、送信できる限り速く送信し、エラーが発生した場合はいつでも修復して再生することです。
私が例外とするその投稿の部分は次のとおりです。
デバイス トークンを正しく取得し、正しい環境に送信している場合、デバイス トークンはほとんどすべて有効です。したがって、失敗がまれであると仮定して最適化することは理にかなっています。
このような巨大な「IF」でそのアドバイスを述語することは、非常に誤解を招くように思えます。ほとんどの開発者がトークンを取得せず、Apple のフィードバック サービスを 100% 「正しく」処理していないことはほぼ保証できます。たとえそうであったとしても、システムは本質的に損失が多いため、ドリフトが発生します。
0 以外のエラー #8 応答 (無効なデバイス トークン) が表示されます。これは、root 化された電話、クライアントのバグ、または意図的にトークンを偽装しているユーザーに起因すると考えられます。また、過去に多数のエラー #7 (無効なペイロード サイズ) を確認しており、開発者が弊社側で追加した不適切にエンコードされたメッセージに突き止めました。もちろん、それは私たちの責任でしたが、それが私の言いたいことです。「失敗がめったに起こらないと仮定して最適化する」ということは、学習中の開発者に送るのは間違ったメッセージです。代わりに私が言うことは:
エラーが発生すると仮定します。
頻繁に発生しないことを願っていますが、そうでない場合に備えて防御的にコーディングしてください。
エラーがほとんど発生しないと想定して最適化すると、APNS サービスがダウンし、送信するすべてのメッセージがエラー #10 を返すたびに、インフラストラクチャが危険にさらされる可能性があります。
問題は、エラーに適切に対応する方法を見つけようとするときに発生します。さまざまなエラーを適切に処理して回復する方法に関するドキュメントがあいまいまたは欠落しています。これは明らかに読者の演習として残されています。