關于IPV6
隨著互聯(lián)網(wǎng)的迅速發(fā)展塌碌,各種聯(lián)網(wǎng)設備總數(shù)的不斷增加,傳統(tǒng)的IPv4地址耗盡已經(jīng)是可以預見的未來,因此,用于替代現(xiàn)行版本IP協(xié)議(IPv4)的下一代IP協(xié)議寡夹,IPv6技術已成為未來的主流IP技術。
據(jù)蘋果在開發(fā)者網(wǎng)站發(fā)布的消息稱厂置,現(xiàn)有的很多應用已經(jīng)兼容IPv6-only協(xié)議了菩掏,因為該協(xié)議已經(jīng)得到NSURLSession和CFNetwork API的支持。使用IPv4 API或硬件編碼IP地址的開發(fā)者需要修改應用代碼才能兼容這項新政策昵济。
除了蘋果之外智绸,整個行業(yè)也在慢慢接受IPv6-only協(xié)議,尤其是提供手機網(wǎng)絡服務的運營商访忿。隨著各種連網(wǎng)設備總數(shù)的增加瞧栗,以及新手機推出的速度越來越快,IPv4地址將迅速耗盡海铆。作為后續(xù)技術迹恐,IPv6將在不遠的將來完全取代IPv4。
Apple關于IPV6規(guī)定
日前卧斟,蘋果公司向開發(fā)者發(fā)出提醒殴边,公司將會修改應用商店App Store的相關規(guī)定憎茂,所有IOS應用必須包含對IPv6-only標準的支持。據(jù)悉找都,該規(guī)定在6月1日生效唇辨,所有提交至蘋果App Store的應用申請必須要兼容面向硬件識別和網(wǎng)絡路由的最新互聯(lián)網(wǎng)協(xié)議--IPv6-only標準。而蘋果的這一舉措也將有助于IPv6的加速普及能耻。
1.只需要在蘋果最新的系統(tǒng)上保證IPV6的兼容性即可赏枚。
2.NSURLConnection CFNetWork NSURLSession都是支持IPV6的在iOS9設備上。
3.AFNetworking晓猛,由于歷史原因饿幅,應用代碼基本上都深度引用了AFHTTPRequestOperation類,所以目前API網(wǎng)絡請求均需要通過NSURLConnection發(fā)送出去戒职,經(jīng)過測試NSURLConnection在最新的iOS9系統(tǒng)上是支持IPV6的栗恩。
4.Reachability在程序中被大量應用判斷網(wǎng)絡狀態(tài),但是在里面卻使用了IPV4專用的API洪燥,經(jīng)過測試磕秤,在iOS9以上系統(tǒng)IPV4和IPV6網(wǎng)絡環(huán)境均可使用,但在iOS8上IPV4和IPV6切換的時候無法監(jiān)測網(wǎng)絡狀態(tài)的改變捧韵,可能是因為蘋果在iOS8上還沒有對IPV6進行相關的支持相關市咆,但是這仍然滿足蘋果要求在最新系統(tǒng)版本上支持IPV6的需求,其實蘋果在iOS9以上對zero Address進行了處理再来,Reachability在iOS9上可以支持IPV6和IPV4蒙兰,但在iOS9一下存在bug,監(jiān)測網(wǎng)絡會有問題芒篷。
避免被拒的措施
- 使用網(wǎng)絡通訊框架搜变;
也就是是說推薦你使用 iOS SDK 自帶的,構建于 socket 上層的網(wǎng)絡通訊框架针炉,或是第三方的網(wǎng)絡通訊框架挠他。這樣,使用網(wǎng)絡通訊框架的話糊识,上面的第 2 條大體上是不用操心的绩社。如果你使用的是第三方的網(wǎng)絡通訊框架的話,一定記得詢問該框架的開發(fā)商:“你們支持 IPv6 嗎赂苗?”
作為網(wǎng)絡通訊框架其中之一的 ProudNet? 是支持 IPv6 的喲愉耙。自 2015 年 12 月的更新版本開始支持。ProudNet 的使用者如果要想支援 IPv6 的話拌滋,應該使用 2015 年 12 月版本朴沿,或更高的版本。
- 避免使用 IPv4 專用的 API;
如果你親自編程 socket 層的話赌渣,記得不能使用 IPv4 專用 API魏铅。比如說,你不能使用如下這些 API (光是使用這些函數(shù)本身坚芜,是否會成為蘋果方面拒絕通過應用審核的事由览芳,目前還不清楚。反正 ProudNet 目前是全然不使用這些函數(shù)的)鸿竖。
inet_addr()
inet_aton()
inet_lnaof()
inet_makeaddr()
inet_netof()
inet_network()
inet_ntoa()
inet_ntoa_r()
bindresvport()
getipv4sourcefilter()
setipv4sourcefilter()
如果要測試在 IPv6 的環(huán)境下是否運轉正常沧竟,你需要構建 IPv6 only 的網(wǎng)絡環(huán)境。方法有很多種缚忧。我們使用的是通過 Mac 機器的方法悟泵。
- 避免使用硬編碼地址(IP地址)。
![Uploading Paste_Image_168249.png . . .]
下面這個API闪水,nodename這個參數(shù)不要傳IP地址糕非,而應該用域名
例如:
下面這個API,nodename這個參數(shù)不要傳IP地址球榆,而應該用域名
這個方法在著名的Reachability中是用到的朽肥,我們常用的網(wǎng)絡庫AFNetworking就用了這個。所以用到的同學得好好查一下了持钉,另外這個項目的作者幾天前剛剛就這個問題有一個新的提交(https://github.com/AFNetworking/AFNetworking/pull/3174/files)
蘋果使用的是“硬編碼地址”這樣的術語鞠呈。不過這大體上只是對大眾友好的簡化說法。正確的學名其實應該叫 IP literal右钾。比方說形如 “11.22.33.44” 這種啦。
另一方面旱爆,我們通常所說的 “hostname”舀射,比方說“server1.mygame.com”這種,學名叫 FQDN (fully qualified domain name)怀伦。
你問脆烟,通過“硬編碼地址”,也就是我們所說的 IP literal 連入服務器的話會有什么樣的后果呢房待?一些 IPv6 網(wǎng)絡下的客戶端會連不上 IPv4 網(wǎng)絡下的服務器(雖說 iOS 9.2 以后這個問題會部分解決邢羔,但是沒法保證在所有 IPv6 網(wǎng)絡下都沒問題)。
反之亦然—客戶端在 IPv4 下桑孩,服務器 IPv6拜鹤。
至于連不上的原因嗎,要從 NAT64 / DNS64 的聯(lián)動關系說起流椒。因為內容有點長敏簿,這里就不贅述了。
那么應該腫么辦呢?乖乖地聽從蘋果大人所“指示”(惯裕?)的温数。通過 FQDN 而不是 IPv4 literal 的連入的情況下,服務器要能夠接收蜻势〕糯蹋客戶端連接服務器時則要使用 FQDN。
舉例說明上面的內容:
- 11.22.33.44 ==> 蘋果會屏蔽你
- server.mygame.com ==> Ok
- 11:22:33:44:55:66:77:88 ==> 蘋果會屏蔽你