對(duì)于蘋果要求6月1日后所有的app必須支持IPv6-only網(wǎng)絡(luò)的問(wèn)題瞬女,蘋果官方文檔給出的說(shuō)明:
https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW25
一.如何確保支持IPv6-only:
1) 使用高級(jí)的網(wǎng)絡(luò)框架(Use High-Level Networking Frameworks)
從上圖可以看出重斑,這里的高級(jí)網(wǎng)絡(luò)框架包括三類:
- WebKit
- Cocoa URL loading system:
NSURL, NSURLSession, NSURLRequest, NSURLConnection
ps:最開始我們一直搞不清楚NSURLConnection在IPv6-only下是否可以繼續(xù)使用丙唧,從這里來(lái)看,是可用的袱蚓。
在stackoverflow上找到了相關(guān)的問(wèn)題:
http://stackoverflow.com/questions/37067619/do-i-need-to-replace-nsurlconnection-in-order-to-achieve-mandatory-support-for-i - CFNetwork
2)不要使用硬編碼的IP地址(Don’t Use IP Address Literals)
在iOS9和OS X 10.11以后,NSURLSession和CFNetwork會(huì)自動(dòng)的把IPv4編碼轉(zhuǎn)換成IPv6地址,但是我們還是要盡量避免使用IP地址
3)無(wú)預(yù)檢鏈接(Connect Without Preflight)
這里主要是針對(duì)Reachability APIs的使用(SCNetworkReachbility Reference)來(lái)檢查網(wǎng)絡(luò)連接狀況所帶來(lái)的一些問(wèn)題在孝。許多app對(duì)這些APIs有不正確的使用。比如把0.0.0.0這樣一個(gè)IPv4的地址傳給SCNetworkReachabilityCreateWithAddress方法去主動(dòng)檢查網(wǎng)絡(luò)連接狀況淮摔。這樣來(lái)表明這里有一路由的存在,卻并不能表示網(wǎng)絡(luò)連接一定存在始赎。
所以我們要避免去預(yù)檢測(cè)網(wǎng)絡(luò)可達(dá)性和橙,而就是使用網(wǎng)絡(luò)連接仔燕,并且優(yōu)雅的處理失敗的情況就可以了。如果你一定要檢查網(wǎng)絡(luò)的可達(dá)性魔招,也要避免調(diào)用SCNetworkReachabilityCreateWithAddress方法晰搀,而改用SCNetworkReachabilityCreateWithName 方法,使用主機(jī)名來(lái)作為參數(shù)办斑。
還有一些app會(huì)通過(guò)把自己分配的本地連接169.254.0.0這樣一個(gè)IPv4的地址傳個(gè)SCNetworkReachabilityCreateWithAddress方法來(lái)檢查Wi-Fi的連通性外恕。其實(shí)檢查Wi-Fi的連通性,可以使用網(wǎng)絡(luò)可達(dá)性的標(biāo)志位kSCNetworkReachabilityFlagsIsWWAN來(lái)代替乡翅。
4)使用適當(dāng)大小的地址存儲(chǔ)容器(Use Appropriately Sized Storage Containers)
比如sockaddr_storage鳞疲,它的大小足夠用來(lái)存儲(chǔ)IPv6的地址。
5)檢查IPv6 DNS64/NAT64不兼容的源碼(Check Source Code for IPv6 DNS64/NAT64 Incompatibilities)
檢查并消除IPv4特定的APIs蠕蚜,比如:
inet_addr()
inet_aton()
inet_lnaof()
inet_makeaddr()
inet_netof()
inet_network()
inet_ntoa()
inet_ntoa_r()
bindresvport()
getipv4sourcefilter()
setipv4sourcefilter()
如果你的代碼處理了IPv4類型尚洽,請(qǐng)確認(rèn)與這些類型等價(jià)的IPv6類型也同樣做了處理。
6)使用系統(tǒng)APIs來(lái)合成IPv6地址
主要是指可以使用getaddrinfo方法來(lái)對(duì)強(qiáng)制需要使用IPv4地址的情況靶累,進(jìn)行處理腺毫。
二.如何驗(yàn)證:
驗(yàn)證方式是使用Mac建立一個(gè)IPv6的無(wú)線網(wǎng),通過(guò)共享網(wǎng)絡(luò)挣柬,是iPhone連接到電腦的熱點(diǎn)進(jìn)行測(cè)試潮酒。