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狀態,一個箭頭,代表正在共享網絡

現在用手機連接看看吧!