1. 程式人生 > >Unity 支援 IPV6 IOS

Unity 支援 IPV6 IOS

               

Apple 強制規定,6月份之後上架的APP  需要支援IPv6 。

Apple在開發者中心添加了完整的程式碼修改指導,以及 如何通過MAC 共享 IPV6 的Wifi ,如下網頁

https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html

翻到網頁最下方的 To set up a local IPv6 Wi-Fi network using your Mac  就是MAC共享 IPV6 Wifi的方法(需要最新的OSX系統和IOS9.3 以上的系統支援

)

Unity 也及時做出了響應,在最新的 4.7.2 以及同時期的 Unity5.3.x 版本中對 IPV6進行了支援。

http://blogs.unity3d.com/2016/05/10/unity-and-ipv6-support/
轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

這兩天我也在弄這事,還比較糾結。

一開始我以為只要更新Unity,然後在MAC上共享出來 NAT64 網路就可以了,後面發現不是這麼回事。

Unity的這次更新只是新增了對IPV6的支援,這是什麼意思?

就是說Unity只是改了API,能支援IPV6的網路了,但是你們之前指定了使用IPV4,那Unity也不會自動幫你們改成IPV6.

我們之前的專案,如果是指定了IPV4的,還是要手動新增對IPV6的相容

也就是說既要考慮到 IPV4的網路支援,又要考慮到 IPV6 的網路支援。

首先,Unity官方強烈要求,一定要使用域名!!

按照Unity官方部落格,上層API,如WWW,我們在使用的時候也沒有做指定IPV4的操作,所以不用修改。

然後底層API,比如Socket,我們之前一般是這樣寫

socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
這就是IPV4 !!

IPV6是這樣寫的

socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);

所以,該怎麼辦呢?

直接從IPV4改成IPV6嗎?那IPV4的網路下就悲劇了。

所以我們要判斷下當前是IPV4還是IPV6的網路環境。

這裡要說到Unity 新增的對IPV6的支援。

其中之一就是  Dns.GetHostAddress 。

如下程式碼

IPAddress[] address=Dns.GetHostAddresses("test.thisisgame.com.cn"); 
如果當前是 IPV6 的網路環境,這個函式會返回一個 IPV6 地址。

如果當前是 IPV4 的網路環境,這個函式會返回一個 IPV4 地址。

大家都知道 IPV6和IPV4是有很大不同的,IPV4是這樣的 127.0.0.1 ,但是IPV6是這樣 64:ff9b::7237:5342

所以我們可以判斷下, GetHostAddress 返回的IP裡面,如果帶有 : 冒號,那麼就是IPV6了,然後指定 Socket使用 IPV6就可以了。

那麼其實,還有簡單的方法,判斷 IPAddress 的 AddressFamily。

address[0].AddressFamily==AddressFamily.InterNetworkV6
這樣就可以判斷是IPV6 還是 IPV4了。

下面是完整程式碼:

using UnityEngine;using System.Collections;using System.Net;using System;using System.Net.Sockets;public class NewBehaviourScript : MonoBehaviour// Use this for initialization void Start () {  }     void OnGUI()    {        if(GUI.Button(new Rect(100,100,300,300),"Connect"))        {            Debug.Log("Connect 0");            IPAddress[] address=Dns.GetHostAddresses("test.thisisgame.com.cn");             //IPAddress[] address = Dns.GetHostAddresses("115.35.88.130");            foreach (var info in address)            {                Debug.Log(info);            }            Socket socket = null;            if (address[0].AddressFamily==AddressFamily.InterNetworkV6)            {                Debug.Log("Connect InterNetworkV6");                socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);            }            else            {                Debug.Log("Connect InterNetwork");                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            }            socket.Connect(address, 56003);            Debug.Log("Connect Success");        }    } // Update is called once per frame void Update () {  }}
轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

服務端不用修改任何東西。

至此。

其它一些問題。

1、如何判斷當前是IPV6網路?

當你的DNS是像下圖中這樣的時候,就是IPV6網路了,再用 Safari 開啟 Apple 官網,如果能開啟,就沒問題。

2、已經是IPV6網路了,但是卻打不開 Apple 官網?

首先看看MAC是否 聯網

然後看看MAC是否開了VPN

關閉無線,開啟重新連線,重複。

3、已經是IPV6網路,但是出現 Access Denied 錯誤

這個錯誤是由於 Socket 中仍然是指定IPV4模式引起的。應該判斷當前是IPV4還是IPV6,如果是IPV6就指定Socket為IPV6模式,程式碼見正文附的程式碼。

轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

3、出現 An address incompatible with the requested protocal was used,是因為沒有升級Unity到最新版本!

附: MAC 共享 IPV6 WIFI方法(需要最新OSX 系統以及 IOS9.3.x 系統支援)

1、首先清除WIFI 連線記錄,然後關閉WIFI,讓MAC接入有線網。

2、按住 Option /Alt 鍵,點選 共享 ,開啟網路共享介面

3、進入到 共享介面,選擇 網際網路共享,然後選擇 共享以下來源的連線為 乙太網 , 用以下埠共享給電腦選擇 WIFI,就是把網線的網 通過WIFI 共享出去。

4、勾選網際網路共享,開始共享網路轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

檢視WIFI狀態,一個箭頭,代表正在共享網路

現在用手機連線看看吧!