Unity – iOS IPv6 之戰

這陣子在搞 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條路線:

  1. 最簡單的方式,直接使用 TcpClient (String, Int32) 直接搞定!!
    BUT!! 在我測試的這個時間點, 這個方式無法控制連線的 timeout (據說預設是20秒左右).
  2. 暴力嘗試法,使用 TcpClient(AddressFamily) 先嘗試 v4 版本, 不行在試 v6 版本.
  3. 精準判定版。呼叫底層的 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を使って接続する

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s