由于IPv6导致的iOS应用发布失败,是否该怪Azure?

Posted 阳光de混

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了由于IPv6导致的iOS应用发布失败,是否该怪Azure?相关的知识,希望对你有一定的参考价值。

IPv6已经被越来越广泛的支持了,尤其是苹果强制要求iOS (确切的说是iOS 9以及后续版本)应用必须支持IPv6之后(官方宣布),更将进一步推动IPv6的使用。

不过苹果应用作为客户端强制要求IPv6,是不是变相地要求服务端也得是IPv6支持的呢?最近就发现很多抱怨,说由于Azure不支持IPv6,所以导致调用了Azure服务的应用发布失败。比如这个Azure feedback里的评论。

首先我同意Azure或者其他服务提供商应该更多的支持IPv6,而且Azure上的VM和负载均衡在大部分区域已经支持IPv6了(具体可查看这里这里)。不过回到这个问题的本身,iOS应用发布失败真的是因为调用了部署在Azure上的服务导致的?根据我的分析,不是。

首先,来看看苹果商店会做哪些检测来判定是否支持IPv6,总结下来有以下几点:

  1. 是否使用网络框架
  2. 是否使用只支持IPv4的API (注意这里的API不是指服务端API,而是客户端引用库里的API,尤其是网络相关的)
  3. 是否有写死的IPv4网络地址

所以压根就跟服务端没什么关系,除非把服务端的URI写死成IPv4地址了。

另外,看看苹果官网关于服务端的说法:

Server updates

If you have a server running on the wider Internet, it is not necessary to update your server immediately. Your server will be accessible to IPv6-only devices via DNS64/NAT64.

最后,看看客户端到服务端访问的全过程,如下图。即使服务端只支持IPv4,支持IPv6的苹果客户端也是可以工作的

 

综上所述,如果iOS应用由于IPv6检测失败导致发布失败,不应该去怪服务端,而应该检查自己的客户端代码:

  1. 是否有写死的IPv4地址
  2. 是否使用底层的网络API,比如gethostbyname,gethostbyname2
  3. 是否使用小单位地址存储类型,比如uint32_t, in_addr

以上是关于由于IPv6导致的iOS应用发布失败,是否该怪Azure?的主要内容,如果未能解决你的问题,请参考以下文章

IOS APP由于IPV6问题被拒怎么解决

AFNetworking 和 IPV6 拒绝 iOS

据称由于 IPv6 连接性,iOS 应用程序被拒绝

KMM:切换操作系统进行构建时,由于被另一个 Gradle 实例锁定而导致构建失败

由于套接字 io 不存在而导致测试失败

应用程序拒绝 NSUrlConnection IPv6 网络问题 iOS