强势的库克时代到来,苹果开启了强制IPV6审核,你们也知道中国如今的状况,除了教育网实验性的支持IPV6,ISP运营商还不支持,想必你们都陆陆续续的遭受到了苹果无情的拒绝,之前开个加急,审核时间也就一天,快的话2小时就能够过,而如今一次又一次的拒绝,让国内开发者苦不堪言.不过聪明的中国人,不会被这样的问题打倒的,中国有句古话叫道高一尺,魔高一丈.公司的两个APP在通过两轮苹果残忍拒绝后,在7月底仍是审核经过了.在此跟你们分享一下审核通关的经验.最近看你们都在聊ipv6审核,有的运气好,没作任何改动就经过了,有的拒绝了10几回仍是通不过.我想说,咱们不靠运气,须要靠实力.
2016年6月1日起全部应用必须支持IPv6-Only网络,一方面App程序开发须要注意支持IPV6,另外一方面为了让苹果快速审核,服务器须要支持IPV6的访问.
这里就不普及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转发示例: