關(guān)于ipv6網(wǎng)絡(luò)請求機制不在贅述辟狈,網(wǎng)上教程挺多,簡單說下我的解決方法夏跷。
蘋果的審核要求是在iOS9以上支持就可以哼转,所以可以不用低版本系統(tǒng)。對于服務(wù)端是不需要做其他的配置拓春,而大部分公司使用的阿里云也確實不支持IPv6释簿。
服務(wù)器不要配置4a記錄,如果配置了4a記錄硼莽,服務(wù)器就必須支持IPv6,這個涉及到后端,工作量略大懂鸵。所以前端轉(zhuǎn)換IPv6地址訪問服務(wù)器是目前較好方法偏螺。只需要把IPv4 IP地址轉(zhuǎn)換為 IPv6地址 使用NAT64轉(zhuǎn)換,在訪問服務(wù)器就可以了匆光。下面貼出轉(zhuǎn)換IP地址方法套像,僅用在iOS9以上。
NSString * ipv6Addresses = [Class convertIpv6WithIpAddresses:@"192.0.0.1"];
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <err.h>
+ (NSString *)convertIpv6WithIpAddresses:(NSString *)ipAddresses {
const char * c_ip = [ipAddresses UTF8String];
char * ipchar = calloc(ipAddresses.length, sizeof(char));
strcpy(ipchar, c_ip);
struct addrinfo hints, *res, *res0;
int error, s;
const char * newChar = "No";
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_DEFAULT;
error = getaddrinfo(ipchar, "http", &hints, &res0);
free(ipchar);
if (error) {
errx(1, "%s", gai_strerror(error));
/*NOTREACHED*/
}
s = -1;
static struct sockaddr_in6 * addr6;
static struct sockaddr_in * addr;
// NSString * NewStr = NULL;
char ipbuf[32];
NSString * TempA = NULL;
for (res = res0; res; res = res->ai_next) {
if (res->ai_family == AF_INET6) {
addr6 =( struct sockaddr_in6*)res->ai_addr;
newChar = inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, sizeof(ipbuf));
TempA = [[NSString alloc] initWithCString:(const char*)newChar
encoding:NSASCIIStringEncoding];
// address = TempA;
// NSString * TempB = [NSString stringWithUTF8String:"&&ipv6"];
//
// NewStr = [TempA stringByAppendingString: TempB];
printf("%s\n", newChar);
} else {
addr =( struct sockaddr_in*)res->ai_addr;
newChar = inet_ntop(AF_INET, &addr->sin_addr, ipbuf, sizeof(ipbuf));
TempA = [[NSString alloc] initWithCString:(const char*)newChar
encoding:NSASCIIStringEncoding];
// NSString * TempB = [NSString stringWithUTF8String:"&&ipv4"];
//
// NewStr = [TempA stringByAppendingString: TempB];
printf("%s\n", newChar);
}
break;
}
freeaddrinfo(res0);
return TempA;
}