AppStore發(fā)布之后的應(yīng)用要兼容IPv6芬沉。
然而我上個星期發(fā)布的版本并沒有因?yàn)闆]兼容而被拒雌团,這次提交卻遇到IPv6兼容問題此疹。僧诚。。
話不多說蝗碎,上代碼:
+(NSString*) getIPWithHostName:(constNSString*)hostName ? {
structaddrinfo * result;
structaddrinfo * res;
charipv4[128];
charipv6[128];
int error;
BOOLIS_IPV6 =FALSE;? ?
?bzero(&ipv4,sizeof(ipv4));??
? bzero(&ipv4,sizeof(ipv6));? ??
error = getaddrinfo([hostName UTF8String],NULL,NULL, &result);
if(error !=0) {
NSLog(@"error in getaddrinfo:%d", error);
return nil;? ?
?}
for(res = result; res!=NULL; res = res->ai_next) {
charhostname[1025] ="";? ?
?error = getnameinfo(res->ai_addr, res->ai_addrlen, hostname,1025,NULL,0,0);
if(error !=0) {
NSLog(@"error in getnameifno: %s", gai_strerror(error));continue;? ?
?}else{
switch(res->ai_addr->sa_family) {
case AF_INET:? ? ? ? ? ? ? ??
memcpy(ipv4, hostname,128);
break;
case AF_INET6:? ? ? ? ??
memcpy(ipv6, hostname,128);? ? ? ? ? ? ? ??
IS_IPV6 =TRUE;
default:
break;? ? ??
? }
NSLog(@"hostname: %s ", hostname);? ?
?}? ??
}? ?
?freenaddrinfo(result);
if(IS_IPV6 ==TRUE)
return[NSStringstringWithUTF8String:ipv6];return[NSStringstringWithUTF8String:ipv4];? ? }
這段代碼即判斷了是否IPv6環(huán)境并解析域名獲得了IP地址湖笨。
測試
首先得配置IPv6網(wǎng)絡(luò)環(huán)境,至于如何配置蹦骑,自行百度"如何搭建IPv6的測試環(huán)境"慈省。
然而配置成功后,用手機(jī)連接的WiFi DNS也是正確的眠菇,運(yùn)行程序測試怎么不成功呢边败,找了好多資料袱衷,猜測是DNS解析除了問題。
那就換另一種方法配置IPv6:拔掉網(wǎng)線笑窜,用mac連接WiFi(沒有WiFi可以用手機(jī)流量分享熱點(diǎn)),然后在共享中用前一種方法配置IPv6(不知道具體是共享到電腦那個端口致燥,索性全點(diǎn)上),記得選中"創(chuàng)建NAT64 網(wǎng)絡(luò)"排截。這時直接通過模擬器測試succeed!
測試成功了嫌蚤。你以為就沒問題了?這里提交依然可能被拒断傲,手機(jī)和 Mac 之間是 IPv6 沒錯脱吱,但 Mac 和你的服務(wù)器之間還是 IPv4 連接。
如果這項(xiàng)測試通過认罩,可以說明:你的客戶端應(yīng)用在 IPv6 網(wǎng)絡(luò)下箱蝠,是(基本)沒有問題的,但是無法驗(yàn)證你的服務(wù)器能夠?qū)?IPv6 網(wǎng)絡(luò)做出正確的響應(yīng)垦垂。然而抡锈,蘋果審核的時候,卻是要去 DNS 服務(wù)器詢問你的服務(wù)器的 IPv6 地址乔外,然后進(jìn)行訪問床三。如果查詢不到 IPv6 地址,可能會進(jìn)而詢問 IPv4 地址杨幼,然后進(jìn)行轉(zhuǎn)換使用撇簿。蘋果明確表示服務(wù)器不需要支持 IPv6,但是有一點(diǎn)蘋果沒有指出來差购,那就是四瘫,雖然你的服務(wù)器不用支持 IPv6,但是必須正確響應(yīng) IPv6 的 DNS 查詢欲逃。
如何驗(yàn)證呢找蜜??使用以下命令即可:
$?dig?+nocmd?+nostats?example.com?AAAA
如果返回的 status 為 NOERROR稳析, 那基本就沒什么問題洗做,但是一定要在多個網(wǎng)絡(luò)環(huán)境下測試都通過才行。如果返回的是其他的響應(yīng)彰居,尤其是 SERVFAIL 的情況诚纸,那就基本杯具了。由于你已經(jīng)驗(yàn)證了客戶端沒有問題陈惰,現(xiàn)在要做的畦徘,就是催著你的運(yùn)維、后臺啥的,趕緊去改 DNS 配置井辆,直到穩(wěn)定返回 NOERROR 為止关筒。