ゲーム開発の備忘録

趣味のゲーム開発でのノウハウや、技術的に嵌ったポイントを忘れないように書き記しておくブログです。

Appleの審査と格闘した話(NTP編)

Appleの審査で嵌ったので記事にしてみました。

Wi-Fiでインターネットに接続できない問題?

趣味開発のiOSアプリをAppleの審査にかけたのですが、Wi-Fi接続時にインターネットに接続不可のエラーメッセージが出るという理由で却下の判定を受けました。ここで気になるのが、アプリ起動時のGame Centerとの通信は上手くいっているのにその後の通信の方でエラーメッセージが出ていたことでした。となると、単純にインターネットに接続できないことが問題なのではないという仮説が立ちます。

犯人はNTP通信

エラーメッセージが出現した箇所ではNTP通信を行っていました。Game Centerとの通信は全てHTTPSなのでTCPの通信ですが、NTPはUDPを利用している通信です。UDPを利用している通信は、ICMPもそうですが得てしてDDoS攻撃に利用される可能性があり、NTPも例に漏れません。複数のクライアントから送信元IPアドレスを詐称したNTPリクエストを大量に送信し、NTPサーバからの応答を詐称先のホストに集中させてサービスをダウンさせるNTP Reflection攻撃など、実際に悪用されています。そのため、Apple側の社内APからインターネットに抜けていく途中のFWにてNTP通信が遮断されており、その結果NW接続不可の判定となったのではないかと考えました。そして、修正を試み、無事に審査を通過したため、この読みは当たっていたようです。
(以前の審査では普通に通過していたため、このタイミングでFWのACLが強化されたのではないでしょうか)
(そもそも、商業でNTP通信を必要とする場合は、自社内のサーバ側でNTPサーバと通信し、それをクライアント側に渡している場合がほとんどかと思います。(実際のところは不明ですが)今回は趣味開発かつNTP通信のためだけにサーバを立てたくないので、クライアント側でNTP通信をさせています)

HTTPSで時刻を取得する

なお、対策としてはHTTPSで時刻を取得するようにしました。(HTTPSでの時刻取得に失敗した時のみNTPを利用するようにしています)NICTがNTPで取得した時刻をHTTPS通信で取得できるようなWeb APIを公開しているため、それを利用させていただきました。
www.nict.go.jp

おまけ:libGDXでのNW通信について

libGDXのNW通信ライブラリは非同期かつTCPの場合のクライアントしか存在しません。そのため、UDP通信を行いたい場合は、Apache Commons Net等の外部ライブラリを利用する必要があります。TCP通信についても同期的な通信を行いたい場合は、Apache HttpComponents等の外部ライブラリを利用する必要があります。AndroidのみであればRetrofitやOkHttp3を利用するのが良いですが、Intel MOEを利用している場合にはビルドできないため、諦めてApacheのNWライブラリを利用しましょう……