前言
6.1AppStore發(fā)布之后的應用要兼容ipv6。
原因是美國ipv4的地址不足。
其實在國內(nèi)完全是相反的地位观蓄,連ipv6的服務器都不多址愿,遍地是ipv4的地址该镣。但是為了應付appstore的策略,勢必是需要讓app兼容的响谓。
我使用的是游戲引擎(cocos unity都用)所開發(fā)的項目损合,所以跨平臺,但是android沒有上架需求娘纷。所以是直接拿一套oc代碼去做的IPV6兼容嫁审。
原理
我想很多人也會像我之前一樣,不太了解什么是Ipv4和Ipv6失驶,其實這只是個本地端口地址土居。
哪里會用到這些地方呢? 應用有網(wǎng)絡通信的地方,當然Http肯定不算擦耀,因為他只有post 和get方法棉圈,不需要用 Connect方法去和服務器做實時通信。所以一旦服務器有socket連接的時候眷蜓,兼容Ipv6就勢在必行了分瘾。
socket連接
既然提到了socket我覺得還是要提一下,不管是什么開發(fā)語言都會有這個連接庫的底層封裝的吁系。舉個例子:oc,c++,c#德召。或者是在網(wǎng)上隨便一搜就是大把的socket i/o封裝汽纤,歸根結(jié)底上岗,其實底層真正真正調(diào)用的方法無非就是幾個,第一個 sockaddr_in蕴坪,這是一個結(jié)構(gòu)體肴掷,賦值這個結(jié)構(gòu)體的sin_family ,sin_port ,sin_addr.s_addr三個值就夠了。第二個是SOCKET 這個類對象賦值背传。
為什么你的應用不兼容Ipv6呆瞻,就是socket里面的connect方法下沒做Ipv6判斷以及沒用ipv6自身的api。
需要改.m 為.mm 加入#include<netdb.h> 頭文件
如何判斷當前網(wǎng)絡是否是ipv6
+(NSString *) getIPWithHostName:(const NSString *)hostName
{
struct addrinfo * result;
struct addrinfo * res;
char ipv4[128];
char ipv6[128];
int error;
BOOL IS_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) {
char hostname[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);
}
}
freeaddrinfo(result);
if(IS_IPV6 == TRUE) return [NSString stringWithUTF8String:ipv6];
return [NSString stringWithUTF8String:ipv4];
}
這個函數(shù)既有了是否是ipv6的判斷径玖,也有了域名解析痴脾。
至于域名解析的意思是,你需要把socket連接的ip地址改成域名梳星。
至于unity或者是cocos里面使用這代碼赞赖,下個篇章我會詳細講oc與,c#,c++混編的內(nèi)容丰泊,當然僅僅使用的話薯定,我詳細可以百度得到,不是一個非常困難的技術瞳购。
測試
- 你需要一個和mac連接的網(wǎng)線轉(zhuǎn)接器话侄,和根有網(wǎng)絡的網(wǎng)線
- 百度mac如何開啟ipv6的網(wǎng)絡
- 注意:在點擊共享的時候,是需要按住option鍵的
- 真機測試:連上mac發(fā)出的wifi学赛,測試網(wǎng)絡是否通
注意事項
ipv6的兼容僅和客戶端有關系年堆。
和服務端沒半毛錢關系。請不要像我一樣遇到這樣的問題就甩鍋給服務端了盏浇。
深深的對不起我服務端大兄弟变丧。