1. IPV6簡(jiǎn)單介紹
網(wǎng)絡(luò)是IPV6還是IPV4是由運(yùn)營(yíng)商和企業(yè)逐漸部署的。
客戶端向服務(wù)器端請(qǐng)求域名解析,首先通過(guò)DNS64 Server查詢IPv6的地址,如果查詢不到,再向DNS Server查詢IPv4地址,通過(guò)DNS64 Server合成一個(gè)IPV6的地址,最終將一個(gè)IPV6的地址返回給客戶端。
但是考慮到我們目前的實(shí)際網(wǎng)絡(luò)環(huán)境仍然是IPV4網(wǎng)絡(luò),所以應(yīng)用需要能夠同時(shí)保證IPV4和IPV6環(huán)境下的可用性。從這點(diǎn)來(lái)說(shuō),蘋果不會(huì)去掃描IPV4的專有API來(lái)拒絕審核通過(guò),因?yàn)镮PV4的API和IPV6的API調(diào)用都會(huì)同時(shí)存在于代碼中(不過(guò)為了減小審核被拒風(fēng)險(xiǎn),建議將IPV4專有API通過(guò)IPV6的兼容API來(lái)替換)。
Apple官方聲明iOS9開(kāi)始向IPV6支持過(guò)渡,在iOS9.2+支持通過(guò)getaddrInfo方法將IPV4地址合成IPV6地址。其提供的Reachability庫(kù)在iOS8系統(tǒng)下,當(dāng)從IPV4切換到IPV6網(wǎng)絡(luò),或者從IPV6網(wǎng)絡(luò)切換到IPV4,是無(wú)法監(jiān)控到網(wǎng)絡(luò)狀態(tài)的變化。
2. 本地搭建IPv6測(cè)試環(huán)境
所需要的就是一臺(tái)用非Wi-Fi的方式上網(wǎng)的Mac電腦。我們的要做的其實(shí)就是用Mac做一個(gè)熱點(diǎn),然后用iPhone連接這個(gè)Wi-Fi。
區(qū)別是這次我們產(chǎn)生的是一個(gè)本地的IPv6 DNS64/NAT64網(wǎng)絡(luò),這項(xiàng)功能是OS X 10.11新加的。和我們以前開(kāi)啟熱點(diǎn)方式不一樣的地方在于,我們?cè)凇癝ystem Preferences”界面選中“Sharing”的同時(shí)
,要按住“Option”
鍵。如下圖:
之后在“Sharing”界面中,我們會(huì)看到和之前不一樣的地方,就是紅框所標(biāo)的地方,多了一個(gè)叫“Create NAT64 Network”的選框,選中它。如下圖:
之后就是按照正常的創(chuàng)建熱點(diǎn)的流程走完就行了。
3. AFN 適配了IPV6
以前沒(méi)有時(shí)間,今天有一點(diǎn)空隙,稍微看了一下AFN對(duì)IPV6的適配。
- 主要修改
- 主要修改的文件AFNetworkReachabilityManager.m。在這個(gè)文件里面:我找到修改的地方是:
+ (instancetype)manager
{
#if (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 90000) || (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
struct sockaddr_in6 address;
bzero(&address, sizeof(address));
address.sin6_len = sizeof(address);
address.sin6_family = AF_INET6;
#else
struct sockaddr_in address;
bzero(&address, sizeof(address));
address.sin_len = sizeof(address);
address.sin_family = AF_INET;
#endif
return [self managerForAddress:&address];
}
```