苹果ipv6审核解决方案

iOS项目审核的时候碰到了因为ipv6 only网络无法访问服务器被拒的问题,服务器用的阿里云,寻找资料后解决了问题,在这里总结下经验

阿里云服务器如何设置IPV6通过appstore的审核

####苹果上架要求:要求支持IPV6only(因为阿里云主机没有IPV6only)

确认IPV6是否开启:

方式1:使用ifconfig查看自己的IP地址是否含有IPv6地址。

方式2.查看服务监听的IP中是否有IPv6格式的地址。(netstat -tuln)

开启IPV6:

vim /etc/sysctl.conf

vim /etc/modprobe.d/disable_ipv6.conf

 

vim /etc/sysconfig/network

至此ipv6的服务器端支持已经完成,重启服务器测试是否支持ipv6,重启后,ifconfig查看ipv6的信息,有看到有关IPV6的输出就可以

添加ipv6隧道:

1.注册Tunnel broker

https://www.tunnelbroker.net/ 注册很容易,就不讲了,注册需要邮箱验证,,gmail、163能收得到认证邮件,qq还是一样收不到

2.创建通道“Create Regular Tunnel”;

填写云服务器ip以及选择默认的隧道节点,点击Create Tunnel创建。填写ip都,如果出现“IP is a potential tunnel endpoint.”则证明可以添加ipv6隧道,一般隧道节点系统已经默认分配,可以手动选择,大家可以在自己的云服务器上分别ping一下这些ip,选时延低的。

3.创建ipv6隧道及路由

到下一页面切换到Example configurations选项卡,如果你的VPS是centOS/Debian这些常见Linux的话,下拉菜单选择Linux-route2,出现了设置的命令,复制到自己的云服务器上运行。

4.测试ipv6

添加ipv6的dns服务器,在最后添加nameserver 2001:4860:4860::8888,nameserver 2001:4860:4860::8844谷歌的ipv6 dns服务器

# vim /etc/resolv.conf
options timeout:1 attempts:1 rotate
nameserver x.x.x.x
nameserver x.x.x.x
nameserver 2001:4860:4860::8888
nameserver 2001:4860:4860::8844
复制代码
# ping6 -c 5 ipv6.google.com
PING ipv6.google.com(tsa03s01-in-x0e.1e100.net) 56 data bytes
64 bytes from tsa03s01-in-x0e.1e100.net: icmp_seq=1 ttl=55 time=25.5 ms
64 bytes from tsa03s01-in-x0e.1e100.net: icmp_seq=2 ttl=55 time=25.5 ms
64 bytes from tsa03s01-in-x0e.1e100.net: icmp_seq=3 ttl=55 time=33.1 ms
64 bytes from tsa03s01-in-x0e.1e100.net: icmp_seq=4 ttl=55 time=25.5 ms
64 bytes from tsa03s01-in-x0e.1e100.net: icmp_seq=5 ttl=55 time=25.4 ms

--- ipv6.google.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4031ms
rtt min/avg/max/mdev = 25.473/27.040/33.180/3.073 ms
复制代码

阿里云服务配置

代理配置好之后服务器中执行ifconfig命令,找到he-ipv6虚拟网卡,找到scope为Global 的ipv6地址,在阿里云后台配置AAAA记录为上面提到的ipv6地址

阿里云文档https://help.aliyun.com/knowledge_detail/39813.html

在线测试:zh.infobyip.com/ping-ipv6.g…

适配IPv6遇到的坑,终极解决方案blog.csdn.net/u010069091/…

6.1AppStore发布之后的应用要兼容IPv6。

然而我上个星期发布的版本并没有因为没兼容而被拒,这次提交却遇到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];
}
复制代码

这段代码即判断了是否IPv6环境并解析域名获得了IP地址。

测试,首先得配置IPv6网络环境,至于如何配置,自行百度"如何搭建IPv6的测试环境"。

然而配置成功后,用手机连接的WiFi DNS也是正确的,运行程序测试怎么不成功呢,找了好多资料,猜测是DNS解析出了问题。

那就换另一种方法配置IPv6:拔掉网线,用mac连接WiFi(没有WiFi可以用手机流量分享热点),然后在共享中用前一种方法配置IPv6(不知道具体是共享到电脑那个端口,索性全点上),记得选中"创建NAT64 网络"。这时直接通过模拟器测试succeed!

测试成功了。你以为就没问题了?这里提交依然可能被拒,手机和 Mac 之间是 IPv6 没错,但 Mac 和你的服务器之间还是 IPv4 连接。

如果这项测试通过,可以说明:你的客户端应用在 IPv6 网络下,是(基本)没有问题的,但是无法验证你的服务器能够对 IPv6 网络做出正确的响应。然而,苹果审核的时候,却是要去 DNS 服务器询问你的服务器的 IPv6 地址,然后进行访问。如果查询不到 IPv6 地址,可能会进而询问 IPv4 地址,然后进行转换使用。苹果明确表示服务器不需要支持 IPv6,但是有一点苹果没有指出来,那就是,虽然你的服务器不用支持 IPv6,但是必须正确响应 IPv6 的 DNS 查询。

如何验证呢??使用以下命令即可:

$ dig +nocmd +nostats example.com AAAA  
复制代码

如果返回的 status 为 NOERROR, 那基本就没什么问题,但是一定要在多个网络环境下测试都通过才行。如果返回的是其他的响应,尤其是 SERVFAIL 的情况,那就基本杯具了。由于你已经验证了客户端没有问题,现在要做的,就是催着你的运维、后台啥的,赶紧去改 DNS 配置,直到稳定返回 NOERROR 为止。

其他参考:blog.csdn.net/nil_lu/arti…关于阿里云HTTPS协议的相关支持

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值