5月初Apple明文规定所有开发者在6月1号以后提交新版本需要支持IPV6-Only的网络,有些用户在这块就踩到坑了,多次被拒。下面我们就Apple在这块的规定分析一下,我们的App如何才能避免在这个问题上吃Apple的闭门羹。
IPV6-Only支持解释
IPV6是对IPV4地址空间的扩充。目前我们用iOS设备连上网络时,设备被分配的地址均是IPV4地址,但是随着运营商和企业逐渐部署IPV6 DNS64/NAT64网络之后,设备被分配的地址会变成IPV6的地址,而这些网络就是所谓的IPV6-Only网络。重点是,目前iOS设备仍然可以通过此网络去获取IPV4地址提供的内容。客户端向服务器端请求域名解析,首先通过DNS64 Server查询IPv6的地址,如果查询不到,再向DNS Server查询IPv4地址,通过DNS64 Server合成一个IPV6的地址,最终将一个IPV6的地址返回给客户端。如图所示:
在Mac OS 10.11+的双网卡的Mac机器(以太网口+无线网卡),我们可以通过模拟构建这么一个local IPv6 DNS64/NAT64 的网络环境去测试应用是否支持IPV6-Only网络,大概原理如下:
具体的搭建方法请参考:
Apple如何审核支持IPV6-Only
Apple说的支持IPV6-Only网络,其实就是说让应用在 IPv6 DNS64/NAT64 网络环境下仍然能够正常运行。我们目前的实际网络环境仍然是IPV4网络,应用需要能够同时保证IPV4和IPV6环境下的可用性。
Apple官方声明iOS9开始向IPV6支持过渡,在iOS9.2+支持通过getaddrInfo方法将IPV4地址合成IPV6地址(The ability to synthesize IPv6 addresses was added to getaddrinfo in iOS 9.2 and OS X 10.11.2)。苹果的审核部门表示,只需要应用在苹果最新的系统上保证IPV6的兼容性即可。
如果应用一直直接使用IPV4地址通过NSURLConenction或者NSURLSession进行网络请求(一般需要服务器允许,且客户端需要在header中伪装host);经测试,IPV6网络环境下,直接使用IPV4地址在iOS9及以上的系统仍然能够正常访问;在iOS8.4及以下不能正常访问;这一点苹果的解释和建议是这样的:
Note: In iOS 9 and OS X 10.11 and later, NSURLSession and CFNetwork automatically synthesize IPv6 addresses from IPv4 literals locally on devices operating on DNS64/NAT64 networks. However, you should still work to rid your code of IP address literals.
应用如何支持IPV6-Only?
对于如何支持IPV6-Only,官方给出了如下几点标准:
1.Use High-Level Networking Frameworks;
2.Don’t Use IP Address Literals;
3.Check Source Code for IPv6 DNS64/NAT64 Incompatibilities;
4.Use System APIs to Synthesize IPv6 Addresses;
官方对 High-Level Networking Frameworks有以下解释:
using high-level networking APIs such as NSURLSession and the CFNetwork frameworks and you connect by name, you should not need to change anything for your app to work with IPv6 addresses
可以明确的是NSURLSession和CFNetwork是支持IPV6的, 经过测试,NSURLConnection在最新的iOS9系统上是支持IPV6的。
结论
API网关的SDK使用的是苹果提供的High-Level Networking Frameworks:NSURLSession进行的网络访问,并且使用的都是域名方式访问,完全支持IPV6-Only的网络环境,可以放心使用。
如果你的App只使用了API网关的SDK进行网络访问,那么你的App上架申请时不会因为不支持IPV6-Only的网络环境而被拒绝。如果因为IPV6 ONLY问题被拒绝,请查找自己的其他代码,看看是否有其他的网络访问代码。
如果你的App还访问了其他网络,请在网络访问时确认以下两点:
- 使用High-Level Networking Frameworks(NSURLSession,CFNetwork frameworks)来访问网络,并且使用域名,不要使用IP。
- 如果必须使用ip来访问网络,对IP进行IPV6的处理后使用。