自从去年6月1号Apple明文规定所有开发者提交新版本都必须支持IPV6-Only的网络,估计很多iOS开发者都遇到由于IPV6网络不支持造成的审核被拒的情况, 我被坑的不轻啊, 下面就来分析一下IPV6问题如何解决。
首先附一个审核被拒的原文:
Guideline 2.1 - Performance - App Completeness
We discovered one or more bugs in your app when reviewed on iPad running iOS 10.3.2 on Wi-Fi connected to an IPv6 network.
Specifically, the app launched to a blank page.
Please see attached screenshots for details.
Next Steps
To resolve this issue, please run your app on a device while connected to an IPv6 network (all apps must support IPv6) to identify any issues, 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. For updates, install the new version as an update to the previous version, then follow the steps to reproduce the issue.
大意是在iPad上运行iOS 10.3.2 wi - fi连接到IPv6网络, 应用程序启动是一个空白页。请在设备上运行您的应用程序,连接到IPv6网络, 然后修改并重新提交你的应用程序进行审查。
一. 简单介绍一下IPV6以及如何搭建检测环境
首先IPV6,是对IPV4地址空间的扩充。目前当我们用iOS设备连接上Wifi、4G、3G等网络时,设备被分配的地址均是IPV4地址,但是随着运营商和企业逐渐部署IPV6 DNS64/NAT64网络之后,设备被分配的地址会变成IPV6的地址,而这些网络就是所谓的IPV6-Only网络,并且仍然可以通过此网络去获取IPV4地址提供的内容。简单来说就是IPV4不够用了, 要换IPV6, 这从苹果一向的以用户体验为主出发, 其实也是为了让用户能用着舒服;
测试是否支持IPV6网上已有更多详细的方法, 照着搭建就行, 下方附搭建环境的方法:
二. 解决办法
总的来说有三个方面的问题:
- 服务器不支持IPV6
- 项目中导入的第三方SDK不支持IPV6
- 项目中涉及到的网络请求不支持IPV6
除了这些, 还有些其他因素, 比如苹果正在审核, 而你们的后台在部署接口, 这种才是真的坑爹😤啊, 不多说, 感觉眼泪止不住往下流了;
1. 服务器
①检测服务器是否支持IPV6
终端输入以下代码:(参照网上方法)
dig +nocmd + nostats 你的域名 AAAA
这是看看你们的服务器在IPV6下是否有回应。
有错误的话, 对照下面的表:
改变DNS的配置,直到稳定返回 NOERROR 为止。
②更改服务器配置
阿里云 Ubuntu 支持 IPv6 的完整步骤
2. 第三方SDK
这些问题一般会出现在那些维护的APP里面, 由于是初次开发APP的人所处的时间相对较远, 所以项目里所用的SDK会有一些功能缺失; 下面介绍几个第三方SDK的问题;
①Reachability
苹果都发话, 这个当然要改了;
新的sdk包将这个方法干掉了:reachabilityForLocalWiFi,只要自己的代码中干掉就行了,没什么影响。
原因如下介绍:
#pragma mark reachabilityForLocalWiFi
//reachabilityForLocalWiFi has been removed from the sample. See ReadMe.md for more information.
//+ (instancetype)reachabilityForLocalWiFi;
②JPush极光推送(v2.1.7开始支持)
这个是我们项目里遇到的问题, SDK版本低了, 不支持IPV6;
从图中可以看出, 2.1.7版本才开始支持IPV6, 而我们版本是2.1.0; 唉😔, 乖乖升级咯;
附:
极光文档地址
③微博SDK(v3.1.4开始支持)
而且从官方文档上发现, 更新SDK, 实际上是更新Reachability库;
附:
微博SDK文档地址
④友盟(v5.2.1开始支持)
附:
友盟文档地址
⑤微信(v1.5开始支持)
有简友说微信的sdk包是支持ipv6的,但是微信本身并不支持ipv6,所以说,即便你替换了最新的sdk包,在ipv6网络下还是不能用微信分享,因为你的app应用在ipv6网络环境下调不起微信,也就分享不了了,这个问题微信应该意识到了,估计后边的版本应该也是支持ipv6, 这个大家可以注意下;
附:
微信文档地址
⑥QQ(未说明)
从变更历史也看不出从哪个版本开始支持的, 估计是觉得这点玩意儿不值得说吧. 大佬们的世界真是看不懂, 大家就按时间来估计吧;
附:
QQ文档地址
⑦支付宝(未说明)
看下载的demo里面, 版本更新历史对具体哪个版本更新的未说明, 万一是最近被苹果打压的才更新的, 也不一定, 反正最新版本肯定是有了, 而且还多了些其他功能;
附:
支付宝文档地址
⑧百度地图(v3.0.0开始支持)
附:
百度地图文档地址
⑨环信(v3.1.3开始支持)
附:
环信文档地址
⑩科大讯飞语音(v1.133开始支持)
附:
科大讯飞语音文档地址
当然还有很多其他的SDK, 这里就不一一列举了, 根据项目里用了哪些, 看下官方文档SDK版本历史比对一下就行;
3. 网络请求
其实对于ipv6_Only的处理,从两大方面进行自己审核:自身网络请求和三方涉及网络请求, 毕竟是由于网络问题;
关于AFNetworking是否支持IPV6, 下面是一网友的说法:
而版本支持是在3.0以后;
当然, 听说网友还遇到了其他的问题:(这个我没遇到, 不过还是在这里记一下😆)
内网的访问下是不可能连接到自己的服务器,后面测试一下公网阿里云的服务器,能够正常连接,这个可能是DNS64在搜索ipv6的过程中,并没有搜索内网的网络,导致内网连接失败;
如果这些还是没能解决你的问题, 可以看看下面这篇文章:
http://www.jianshu.com/p/a6bab07c4062
最后感谢参考文章作者的分享, 希望攻城狮们早日解决bug, 继续撸代码, O(∩_∩)O哈哈~
本文参考文章:
iOS 被拒6次的ipv6
Ipv6_Only 简单的理解(已验证,项目已经上线)
推荐阅读文章:
iOS应用支持IPV6,就那点事儿