這陣子在搞 iOS 送審, 真的如同傳聞中的麻煩哪~
然後又趕上 IPv6 相容性變成必要行為的宣告 (目死
我們獲得的第一個 reject ,便是無法在 IPv6 的環境下運作.
(當時我們的開發環境是 Unity 5.2.4f1)
開發/測試環境:
Unity 5.2.5f1 (本來要順便上5.3,但會導致部分機種crash就放棄了 Orz..)
XCode 7.3.1
OS X 10.11.5
iPhone 6s plus with 9.3.5
1. 網路
首先要先弄出一個 Apple 審查用的網路環境(這很重要),這個只要在 OSX 10.11 以上版本的MAC就可以輕鬆產出~
可參考「6.1后苹果要求APP兼容IPv6,本地如何搭建IPv6环境测试你的APP?」
2. 調整
首先要用 host 取代 IP 直連
蒐尋IP字串的正規表示式「\d+(\.\d+){3}」
ref:「在 Xcode 搜尋寫死的 IPv4 的位址」
接著是 TcpClient 的初始化方式。我知道的有3條路線:
- 最簡單的方式,直接使用 TcpClient (String, Int32) 直接搞定!!
BUT!! 在我測試的這個時間點, 這個方式無法控制連線的 timeout (據說預設是20秒左右). - 暴力嘗試法,使用 TcpClient(AddressFamily) 先嘗試 v4 版本, 不行在試 v6 版本.
- 精準判定版。呼叫底層的 getaddrinfo 取得資訊,回傳內容中的 ai_family 會指出版本。
詳細可參考「Unity IPv6 Socket 支持,已测试通过」
使用到 Socket.RemoteEndPoint 這個欄位,會觸發 exception:
「An address incompatible with the requested protocol was used.」
據說是個應該要修好的 BUG?
因為這個在我們專案中不算是個必要訊息就直接放生,
需要的話可以用 Dns.GetHostAddresses 查詢~
其他參考:
「Supporting IPv6 DNS64/NAT64 Networks」
「Unity and IPv6 Support」(中文)
「Unity&iOS9&IPv6ネットワークでホスト名のないIPv4アドレスにSocketを使って接続する」