在WWDC2015上蘋果宣佈iOS9將支援純IPv6的網路服務。2016年初開始所有提交到App Store的應用必須支援IPv6。為確保現有的應用是相容的,我們需要注意下面幾點。
不建議使用底層的網路API
下圖展示的藍色部分的這些API都是不存在相容性問題的,而我們平時自己用的包括那些第三方的網路庫大部分都是用的這些API。
![針對蘋果最新稽核要求為應用相容IPv6](https://i.iter01.com/images/404b7ba95c92898c1298ffdf5661c567da161646dcd232d474059e6b1e60047e.png)
大部分情況下,我們用高階的API完全能夠實現我們的需求,而且高階API封裝的很便於使用,很多底層的像適配IPv6的工作都已經幫我們做好了。而用底層API會有大量的工作要我們自己來做,更容易產生bug。但你如果確實需要用底層的POSIX socket API, 請參照這個RFC4038: Application Aspects of IPv6 Transition的指導。
不要用IP地址
比如下面這個API,nodename這個引數不要傳IP地址,而應該用域名
![針對蘋果最新稽核要求為應用相容IPv6](https://i.iter01.com/images/54fdaf1c7336fe2f532d76f761a0fcc20b918f742c8698cee8fe337843c5fc95.png)
這個方法在著名的Reachability中是用到的,我們常用的網路庫AFNetworking就用了這個。所以用到的同學得好好查一下了,另外這個專案的作者幾天前剛剛就這個問題有一個新的提交,不過最新的release版本中還沒有加進去,可以點下面連結先去看看他都改了哪些地方。
Added support for IPv6 to Reachability #3174
檢查不相容IPv6的程式碼
搜一下工程裡有沒有下面的這些API,這些都是隻針對IPv4做處理的,有的話就刪了。
inet_addr()
inet_aton()
inet_lnaof()
inet_makeaddr()
inet_netof()
inet_network()
inet_ntoa()
inet_ntoa_r()
bindresvport()
getipv4sourcefilter()
setipv4sourcefilter()
如果用到了下面左邊的這些IPv4的型別,那麼它們相應的IPv6型別也需要做處理
![針對蘋果最新稽核要求為應用相容IPv6](https://i.iter01.com/images/04f4869dc7e19bb8923b6e2f154f8a3ca0339c86e6e601fdd54d1af28ee6962e.png)
本地搭建IPv6測試環境
最後我們來搭一個IPv6的測試環境吧,你所需要的就是一臺用非Wi-Fi的方式上網的Mac電腦。
我們的要做的其實就是用Mac做一個熱點,然後用iPhone連線這個Wi-Fi,聽起來很容易,我相信大家在公司就是這麼幹的吧。
區別是這次我們產生的是一個本地的IPv6 DNS64/NAT64網路,這項功能是OS X 10.11新加的。和我們以前開啟熱點方式不一樣的地方在於,我們在“System Preferences”介面選中“Sharing”的同時,要按住“Option”鍵。
![針對蘋果最新稽核要求為應用相容IPv6](https://i.iter01.com/images/fcca809956a87da3d45b0407c617f148acb33f533cc31cd499abd213ccb9fdf0.png)
之後在“Sharing”介面中,我們會看到和之前不一樣的地方,就是紅框所標的地方,多了一個叫“Create NAT64 Network”的選框,選中它。
![針對蘋果最新稽核要求為應用相容IPv6](https://i.iter01.com/images/d568ce8f45b8f612e1d52e6d967266d54c9773410deda08fb08b50ca38a380db.png)
之後就是按照正常的建立熱點的流程走完就行了。
現在我們用iPhone連線上這個剛建立好的熱點就可以測試了,注意此時要把iPhone設成飛航模式,以保證只用Wi-Fi上網。