(R)UDP通信のマルチプレイアプリはiOS審査でリジェクトされる

iOS 審査の罠

iOS審査ってキツイですよね.
マルチプレイアプリをiOSリリースする際には注意することがあります.

対策を施していない場合,Apple の方の環境では接続処理の際にエラーが発生してリジェクトされます.
(Unity の場合,Photon,MLAPI,Mirror,Mirage等どれを選択しても同じ)

リジェクト理由は「接続エラーが出ています.対応してください.」の一点張りです.
接続処理に対して細かくエラーハンドリングを実装したとしても,結局接続失敗エラーだぞという答えしか返ってきません.

接続エラーの原因

developer.apple.com

Unfortunately we didn't find a solution. But we noticed in the past months that many developers are facing the same issue (UDP socket don't go through their VPN, while TCP does)
So there is definitely something wrong on Apple reviewer's side.

AppleVPN 環境による問題によるもので,(R)UDP 通信がブロックされる環境のようです.TCP通信なら大丈夫な模様.
精確な情報かわかりませんが,Redditの投稿ではコロナになってから発生している問題らしい?(間違ってたらすみません)

www.reddit.com

Since the covid lockdown, uploading apps/game that use UDP sockets leads to an app rejection as Apple reviewers seems to not been able to send/receive UDP packets.
Many devs are facing the same issue, and no one found a solution yet (except using TCP sockets, which is not a solution in itself). Apple doesn't answer on this subject and everyday there are devs contacting me to ask me if I found a solution.

では TCP 通信にする… ?

これの対応としては,(R)UDP通信ではなくTCP通信を採用することなんですが,
遅延が極力少ないリアルタイム性を売りにしているゲームの場合はこれは致命的なんですよね.

note.com

www.slideshare.net

決め打ちで TCP にする対応はターン制のアプリならありですが,
リアルタイム性が重要なアプリの場合は現実的ではない気がします.

対応策

これが正道かどうかわかりませんが,
マルチプレイ鯖に接続処理を行う前に,トランスポートプロトコルを切り替える処理を実行する方法が考えられます.
iOS審査の際にログイン用のIDやパスワードを事前に教える項目があるのですが,
iOS審査用のIDが入力された時は TCP 通信にする,他のIDの場合は (R)UDP 通信にする流れです.

例えば Photon の場合だとプロトコルの項目が PhotonServerSettings にあって,デフォルトでは UDPですが,
iOS審査用のIDを入力したら WebSocket か TCP に切り替えるようにするような感じです.