强势的库克时代到来,苹果开启了强制IPV6审核,大家也知道中国现在的情况,除了教育网实验性的支持IPV6,ISP运营商还不支持,想必大家都陆陆续续的遭受到了苹果无情的拒绝,以前开个加急,审核时间也就一天,快的话2小时就可以过,而现在一次又一次的拒绝,让国内开发者苦不堪言.不过聪明的中国人,不会被这样的问题打倒的,中国有句古话叫道高一尺,魔高一丈.公司的两个APP在经过两轮苹果残忍拒绝后,在7月底还是审核通过了.在此跟大家分享一下审核通关的经验.最近看大家都在聊ipv6审核,有的运气好,没做任何改动就通过了,有的拒绝了10几次还是通不过.我想说,我们不靠运气,需要靠实力.
2016年6月1日起所有应用必须支持IPv6-Only网络,一方面App程序开发需要注意支持IPV6,另一方面为了让苹果快速审核,服务器需要支持IPV6的访问.
我们先来看下苹果官方对于IPV6的要求及如何测试(苹果官方说明:开发注意事项和如何测试IPV6 Only的支持)
这里就不普及IPV6基础知识,我们主要看看程序开发需要支持的地方和送审时服务器的配置.
一.第一步:确保你的应用程序中没有违反以下基本原则
1.禁止在协议中使用IP地址。许多通信协议,如会话发起协议(SIP),文件传输协议(FTP)的WebSockets和对等网络协议(P2PP),包括在协议报文的IP地址文字。例如,该FTP参数的命令DATA PORT,并PASSIVE包括IP地址文字交换信息。类似地,IP地址文字可能出现在SIP报头字段,例如的值To,From,Contact,Record-Route,和Via.
2.禁止在配置文件中的使用IP地址,而是使用域名。配置文件通常包含IP地址的文字.
3.不建议使用IP进行网络预检。许多应用程序试图主动检查Internet连接,或者通过IP地址常量来网络可达性的API活跃的Wi-Fi连接。
如果由于业务需要,使用了Reachability进行网络的状态判断,不用担心,勿须作任何修改,Reachability在IOS9上是支持ipv4和ipv6的.但在IOS8以下不支持ipv6,但这仍满足苹果对于最新系统上支持ipv6的政策要求.
4.不要使用低级别的网络API。有些应用与插座等原始的网络API,如直接合作gethostbyname,gethostbyname2和inet_aton。这些API都容易滥用或他们只支持IPv4,例如,主机名解析为AF_INET地址族,而不是AF_UNSPEC地址族.
5.用小地址族的储存容器。有些应用程序和网络库使用的地址存储容器,如uint32_t,in_addr和sockaddr_in-即都是32位或更小。请参阅使用大小合适的贮存容器.
6.检查源代码对于IPv6 DNS64 / NAT64不兼容性,发现以下的方法,请删除,检查并消除特定的IPv4的API,如:
inet_addr()
inet_aton()
inet_lnaof()
inet_makeaddr()
inet_netof()
inet_network()
inet_ntoa()
inet_ntoa_r()
bindresvport()
getipv4sourcefilter()
setipv4sourcefilter()
getaddrinfo()
getnameinfo()
7. 应用里面的API请求,一般都会使用AFNetworking进行请求发送,鉴于历史因素,应用的代码基本上都引用了AFHTTPRequestOperation类,所以目前API网络请求均需要通过NSURLConnection发送出去,所以必须确认NSURLConnection是否支持IPV6. 经过测试,NSURLConnection在最新的iOS9系统上是支持IPV6的,IOS9.3在NAT64环境下会将ipv4合成ipv6,因此能够正常访问.
8.本机IP获取支持IPV6,在模拟器和真机上都会出现以FE80开头的IPV6单播地址影响我们判断,所以在这里进行特殊的处理,当第一次遇到不是单播地址的IP地址即为本机IP地址
(NSString *)deviceIPAdress
{
while (temp_addr != NULL) {
NSLog(@"ifa_name===%@",[NSString stringWithUTF8String:temp_addr->ifa_name]);
// Check if interface is en0 which is the wifi connection on the iPhone
if ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"] || [[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"pdp_ip0"])
{
//IPV4地址,直接转化
if (temp_addr->ifa_addr->sa_family == AF_INET){
// Get NSString from C String
address = [self formatIPV4Address:((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr];
}
//IPV6地址
else if (temp_addr->ifa_addr->sa_family == AF_INET6){
address = [self formatIPV6Address:((struct sockaddr_in6 *)temp_addr->ifa_addr)->sin6_addr];
if (address && ![address isEqualToString:@""] && ![address.uppercaseString hasPrefix:@"FE80"]) break;
}
}
temp_addr = temp_addr->ifa_next;
}
}
}
二.网络和服务器同时支持ipv6
网络部分需要服务器支持IPV6访问,但国内除了教育网外,运营商暂时还不支持,要想让苹果审核团队顺利的访问国内的服务器,就需要一台支持IPV6的服务器进行中转,具体的原理也很简单,找一台国外支持ipv6的服务器作为流量中转即可.
让域名支持ipv6,将AAAA记录解析到支持ipv6的服务器上.有以下几种方式获得支持ipv6的服务器
- 购买国外支持ipv6的vps,比如搬瓦工,Linode,host1plus
- 通过he.net为Linux添加ipv6支持.
参考链接 :
通过上面的方式比较麻烦些,需要购买国外服务器,如果你想快速的搭建服务器并支持ipv6,可以使用我的服务器作为中转,将域名AAAA记录解析到 2607:8700:102:d63b:: 这个ipv6的地址上,然后邮件" dekinsq@gmail.com " 将转发地址+端口发给我,如果是SSL地址,请将证书文件(*.key,*.pem)一并发给我,我将提供转发服务,只会将来自ipv6的流量(苹果审核流量)转发到真实的服务器,并不会影响国内用户的访问.
注:收到订单后1小时内处理完成,可加微信"sh110876925"进行沟通.添加微信时请注明审核通关.
示意图如下:
查看服务器ipv6和ipv4地址:
以下是阿里云域名解析示例:
以下为nginx转发示例:
测试域名是否能解析并正常访问,打开 http://ipv6-test.com/validate.php 并输入你的域名,即可验证,绿色钩表示通过,可正常访问.