首页 > 代码库 > 关于IPv6
关于IPv6
求解决方法
被拒原因
We discovered one or more bugs in your app when reviewed on iPhone running iOS 10.1.1 on Wi-Fi connected to an IPv6 network.
Specifically, we received a network error message when we used the demo account to log in.
Next Steps
Please run your app on a device while connected to an IPv6 network (all apps must support IPv6) to identify the issue(s), then revise and resubmit your app for review.
If we misunderstood the intended behavior of your app, please reply to this message in Resolution Center to provide information on how these features were intended to work.
For new apps, uninstall all previous versions of your app from a device, then install and follow the steps to reproduce the issue(s). For updates, install the new version as an update to the previous version, then follow the steps to reproduce the issue(s).
Resources
For information about supporting IPv6 Networks, please refer to Supporting IPv6 DNS64/NAT64 Networks and About Networking
网上好多关于ipv6的资料,说半天ipv6是什么,怎么建立测试环境,,,可是没有看到具体的操作和解决的方案,这里,为大家提供一种方案,希望给大家带来帮助吧。
总的来说有三个方面需要进行检查和修改:
1、项目里面涉及和网络有关的网络请求是否支持ipv6。
2、项目里面涉及和网络有关的sdk是否支持ipv6。
3、项目的服务器是否支持ipv6。
IPv6的简介
IPv4 和 IPv6的区别就是 IP 地址前者是 .(dot)分割,后者是以 :(冒号)分割的(更多详细信息自行搜索)。
PS:在使用 IPv6 的热点时候,记得手机开飞行模式哦,保证手机只在 Wi-Fi 下上网,以免手机在连接不到网络时候,会默认跳转到使用 蜂窝移动网络(即2G、3G、4G流量) 上网。
IPV6,是对IPV4地址空间的扩充。目前当我们用iOS设备连接上Wifi、4G、3G等网络时,设备被分配的地址均是IPV4地址,但是随着运营商和企业逐渐部署IPV6 DNS64/NAT64网络之后,设备被分配的地址会变成IPV6的地址,而这些网络就是所谓的IPV6-Only网络,并且仍然可以通过此网络去获取IPV4地址提供的内容。客户端向服务器端请求域名解析,首先通过DNS64 Server查询IPv6的地址,如果查询不到,再向DNS Server查询IPv4地址,通过DNS64 Server合成一个IPV6的地址,最终将一个IPV6的地址返回给客户端。如图所示:
网上对于苹果官网上ipv6的文章翻译很多,附上链接,这篇介绍的不错:iOS应用支持IPV6,就那点事儿
本地 Mac 搭建 IPv6 测试环境
附上链接:本地如何搭建IPv6环境测试你的APP
(上边这些几乎没什么用,网上一搜有很多。。。)
如何判断自己的项目里面是否是ipv6、ipv4呢,我们用的方法,就是自己项目里面涉及和网络有关的进行一一排查。
(文章最后会提到ipv6解决的方案除了上述两点还有一个关于服务器的原因。)
我们的app本身支持ipv6是因为我们使用的网络请求是asihttpRequest请求,而asihttpRequest是基于CFNetwork的,苹果有说明CFNetwork库是支持IPV6的。而除了自身的网络请求外,我们项目中涉及网络的就是三方库了,所以归根到底我们做的只是第三方库的替换,即:哪些三方库和网络有关,那么挨个查看最新的sdk文档解释是否描述支持ipv6,如果支持,那就替换。如果没说支持,那就不换。
(当然,还可以用cocoadpods替换三方库,关于cocoadpods的学习可以参考本人这篇文章Cocoapods安装)
这种方案需要验证,估计需要几天的时间才能知道上线是否被拒。如果侥幸上线了,我会第一时间在本文里面续写一下。如果被拒,我也会第一时间排查原因,进行本文的更新。谢谢大家的支持。
已经上线了,该方案可行。
那么我们替换了哪些三方库呢,下边一一列举。(文章下部会有各个三方库的链接)
1、Reachability
按照苹果开发者中心提示,这个必须换。
新的sdk包将这个方法干掉了:reachabilityForLocalWiFi,只要自己的代码中干掉就行了,没什么影响。
原因如下介绍:
#pragma mark reachabilityForLocalWiFi //reachabilityForLocalWiFi has been removed from the sample. See ReadMe.md for more information. //+ (instancetype)reachabilityForLocalWiFi;
2、新浪微博
根据官网提示,这个新的sdk支持了ipv6,所以进行替换。
替换后:
根据比较,新旧sdk只有上述变化,替换后command+B编译无错误提示。应该没事。
3、连连支付
按照连连支付官方文档
最新的sdk包是支持ipv6的,但是旧包也是支持的。项目中用的是2.4.0,官网上最新包是2.4.7,最后我们做了替换。
替换后报错了:
原因是在新的sdk包里将报错的这两个方法合成了一个。
在新的方法里面添加了一个判断支付类型的参数。
根据项目中报错的两个地方,第一个是快捷支付,第二个是认证支付。按照之前的进行了修改。command+B编译无错误提示。应该没事。
但是实际上还是遇到了崩溃的bug。然后我们换回了2.4.0版本,应为连连支付官网上说之前的版本也支持ipv6,我们之前的版本没有问题,所以换了回来,看看上线能成功不。
4、友盟
按照友盟官方sdk文档描述,需要更换新的sdk包。
按照需要,勾选了如下:
OMG,搞错了,项目里面的友盟是友盟分析,上边那个是友盟分享。。。
但是根据官方文档,好像我们的不用替换,因为涉及到什么IDFA,我们项目好像不涉及这个。
5、微信
按照微信最新sdk包1.7版本里面的README.txt,最新的sdk包支持ipv6
而我们项目中的微信是1.5版本的。应该进行替换。command+B编译无错误提示。应该没事。
比较可笑的是微信的sdk包是支持ipv6的,但是微信本身并不支持ipv6,所以说,即便你替换了最新的sdk包,在ipv6网络下还是不能用微信分享,因为你的app应用在ipv6网络环境下调不起微信,也就分享不了了,这个问题微信应该意识到了,估计后边的版本应该也是支持ipv6的吧。
6、QQ
官方文档好像也没有说ipv6的事啊
7、支付宝sdk支持了ipv6!!!
可是下载的时候总是打不开.zip的压缩包。。。叫别人帮忙下载了一份
command+B编译无错误提示。应该没事。
8、百度地图
根据比较,新的sdk包没有了bundle文件。需要将旧包的bundle文件拷贝进来。
各个sdk下载地址:
reachability
新浪微博
连连支付
友盟统计分析
微信
支付宝
百度地图
总之,对于ipv6_Only的处理就是这样办的,从两大方面进行自己审核:自身网络请求和三方涉及网络请求。
关于AFNetworking是否支持ipv-6,有网友如是说:
可见,AFNetworking是支持ipv-6的。但是,关于支持ipv6的afn版本有如下说明:
另外有网友遇到这样一个问题:这里还遇到一个坑,内网的访问下是不可能连接到自己的服务器,后面测试一下公网阿里云的服务器,能够正常连接,这个可能是DNS64在搜索ipv6的过程中,并没有搜索内网的网络,导致内网连接失败(这里卡了半天, 切记)(这个问题笔者并没有遇到,也没有亲测,大家注意一下这个问题,如果遇到了,知道是怎么回事。)
最后,有的网友上线被拒了,可能是因为app的服务器端没有支持ipv6,就此问题,我咨询了我们的技术经理,技术经理说“后台(即服务器)是要做ipv6的支持工作的”。但是具体是谁管,具体怎么操作的我就不得而知了,这里大家注意一下吧:不仅仅是客户端这边支持ipv6,上线之前最好问一下后台端是不是做了相应的ipv6的支持。
这里关于自己的服务器是否支持ipv6,有网友提供了一个方法,大家可以试一下。(谢谢杭州-托儿索被拒6次的ipv6,争得托儿索的同意,进行转发)
前两条说的就是我们的方案:项目里面涉及和网络有关的进行一一排查。
第三条是在自己电脑上判断是否服务器支持ipv6的。亲测,在终端得到下图:
按照托儿索的说法,上图的位置那里显示NOERROR说明服务器没有问题,也是支持ipv6的。如果有错的话,可以按照下边提供的表格进行对照。
再看托儿所的结论,我们会得到下边的结论,涉及支持ipv6的其实是包括三个方面的:
1、项目里面涉及和网络有关的网络请求是否支持ipv6。
2、项目里面涉及和网络有关的sdk是否支持ipv6。
3、项目的服务器是否支持ipv6。
最后,说一下关于托儿索的命令行:终端 dig +nocmd + nostats 你的域名 AAAA,我在网上查了一下发现有这么个命令行:
为了方便复制:digwww.isc.orgAAAA +short
得到的结果直接就是一个ipv6格式的,不知道不支持ipv6服务器的是不是打印出来的是不是ip地址(有待验证)。如果谁验证了,希望告知我一声。在此谢谢了。所以也可以用这个命令行侧面验证服务器是否支持ipv6。
参考文章:
http://www.jianshu.com/p/97b205933c15
关于IPv6