强势的库克时代到来,苹果开启了强制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转发示例:
- 用尽洪荒之力整理的Mysql数据库32条军规(转)
今天上午吐血整理了Oracle SQL性能优化的40条军规,其中很多规则也是适用于Mysql的,结果今晚发现这一篇文章——用尽洪荒之力整理的Mysql数据库32条军规,和我的竟有异曲同工之妙,当然不同 ...
- 用尽洪荒之力学习Flask源码
WSGIapp.run()werkzeug@app.route('/')ContextLocalLocalStackLocalProxyContext CreateStack pushStack po ...
- linux服务器关闭ipv6 方法
第一个文件: /etc/sysconfig/network 第二个文件:如无此文件,vim添加 /etc/modprobe.d/disable_ipv6.conf
- App审核被拒(后台定位被拒,ipv6被拒,广告标示被拒的解决方案)
ipv6被拒问题描述: 解决方案支持ipv6 1)搭建ipv6 环境,搭建好的ipv6 ,环境会有一个共享wifi, 具体如何搭建ipv6测试环境参考本地如何搭建IPv6环境测试你的APP2)app连 ...
- iOS应用支持IPV6,就那点事儿
原文连接 果然是苹果打个哈欠,iOS行业内就得起一次风暴呀.自从5月初Apple明文规定所有开发者在6月1号以后提交新版本需要支持IPV6-Only的网络,大家便开始热火朝天的研究如何支持IPV6 ...
- iOS应用支持IPV6
一.IPV6-Only支持是啥? 首先IPV6,是对IPV4地址空间的扩充.目前当我们用iOS设备连接上Wifi.4G.3G等网络时,设备被分配的地址均是IPV4地址,但是随着运营商和企业逐渐部署IP ...
- linux系统关闭IPv6的方式
云服务器 ECS> Linux操作运维问题 > 应用配置 > linux系统关闭IPv6的方式 linux系统关闭IPv6的方式 IPv6被认为是IPv4的替代产品,它用来解决现有I ...
- App store 应用审核由于 IPv6 网络问题被拒的一点分析
App store 应用审核由于 IPv6 网络问题被拒的一点分析 六月以后陆续有一些软件提交市场的时候被拒了,症状基本就是无法登陆啥的.我们公司的应用也未能幸免. 很多同学也想了不少办法,申诉. ...
- 配置阿里云ECS支持IPv6,解决苹果app审核失败问题
前几天iOS的App提交给苹果审核没通过,给出的原因是:该应用在 IPv6 的环境下无法使用.检查发现:阿里云优化过的系统没有启用IPv6协议,需要配置启用一下,但是只单独启用IPv6也是无法直接提供 ...
随机推荐
- python之字符聊天小工具
server side: # coding: gb2312#socket server端#获取socket构造及常量from socket import *#''代表服务器为localhostmyHo ...
- WINDOWS之入侵痕迹清理总结
Windows的日志文件通常有应用程序日志,安全日志.系统日志.DNS服务器日志.FTP日志.WWW日志等等. 应用程序日志文件:%systemroot%\system32\config\AppEve ...
- 【原创】angularjs1.3.0源码解析之service
Angular服务 在angular中,服务(service)是以提供特定的功能的形式而存在的. angular本身提供了很多内置服务,比如: $q: 提供了对promise的支持. $http: 提 ...
- mySQL笔记2
php主要实现B/S .net IIS java TomCat LAMP: Linux 系统 A阿帕奇服务器 Mysql数据库 Php语言(KE) mysql:c常用代码 create table c ...
- Spring3中的mvc:interceptors标签配置拦截器
mvc:interceptors 这个标签用于注册一个自定义拦截器或者是WebRequestInterceptors. 可以通过定义URL来进行路径请求拦截,可以做到较为细粒度的拦截控制. 例如在配置 ...
- 简单实现Tab切换(带框架)
<script type="text/javascript"> $(function () { //加载时添加的标签卡 if ('<%=Request[" ...
- Lucene4.3开发之分词器总结
Lucene4.3开发之分词器总结 http://java.chinaitlab.com/tools/940011.html
- 用Lucene检索数据库
http://blog.sina.com.cn/s/blog_82ac67c101012r9z.html package com.javabean; import java.io.File;impor ...
- 最长公共子序列 NYOJ37
http://acm.nyist.net/JudgeOnline/problem.php?pid=37 先逆转原来的字符串,再用原来的字符串跟逆转后的字符串进行比较,求得的最长公共子序列就是回文串,也 ...
- ubuntu 修改保存报错E37:No write since last change(add ! to override)的解决方法
报错信息如下: E37: No write since last change (add ! to override) 解决办法是: 在修改完后,将命令 :q 改成 :wq 即可.