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進行了支持。
這兩天我也在弄這事,還比較糾結。
一開始我以為只要更新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);
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");
如果當前是 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
下面是完整代碼:
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 () { } }
服務端不用修改任何東西。
至此。
其它一些問題。
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狀態,一個箭頭,代表正在共享網絡
現在用手機連接看看吧!