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狀態,一個箭頭,代表正在共享網路
現在用手機連線看看吧!