iOS中关于苹果审核IPv6的问题( 二 )


3.1 是否支持IPV6?
官方的这句话让我们疑惑顿生:
using high-levelAPIs such asand theand youby name, younot need tofor your app to work with IPv6
只说了和的API不需要改变,但是并没有提及到 。从上文的参考资料中,我们看到、同属于Cocoa的url,可以猜测出在ios9上是支持IPV6的 。
应用里面的API网络请求,大家一般都会选择进行请求发送,由于历史原因,应用的代码基本上都深度引用了on类,所以目前API网络请求均需要通过发送出去,所以必须确认是否支持IPV6. 经过测试,在最新的iOS9系统上是支持IPV6的 。
3.2 Cocoa的URL从iOS哪个版本开始支持IPV6?
目前我们的应用最低版本还需要支持iOS7,虽然苹果只要求最新版本支持IPV6-Only,但是出于对用户负责的态度,我们仍然需要搞清楚在低版本上URL的API是否支持IPV6.
(to fix me, make some )待续~~~
3.3 是否需要修改支持IPV6?
我们可以查到应用中大量使用了进行网络状态判断,但是在里面却使用了IPV4的专用API 。
在Pods:Reachability中AF_INETFiles:Reachability.mstruct sockaddr_inFiles:Reachability.h , Reachability.m
那应该如何支持IPV6呢?
(1)目前的开源库的最新版本是3.2,苹果也出了一个 IPV6 的的官方样例,我们比较了一下源码,跟上的没有什么差异 。
(2)我们通常都是通过一个0.0.0.0 ()去开启网络状态监控,经过我们测试,在iOS9以上的系统上IPV4和IPV6网络环境均能够正常使用;但是在iOS8上IPV4和IPV6相互切换的时候无法监控到网络状态的变化,可能是因为苹果在iOS8上还并没有对IPV6进行相关支持相关 。(但是这仍然满足苹果要求在最新系统版本上支持IPV6的网络) 。
(3)当大家都在要求添加对于IPV6的支持,其实苹果在iOS9以上对Zero 进行了特别处理,官方发言是这样的:
: Thisthe0.0.0.0,
whichas atoken thatit to
theof the , both IPv4 and IPv6.
+ (instancetype)reachabilityForInternetConnection {struct sockaddr_in zeroAddress;bzero(&zeroAddress, sizeof(zeroAddress));zeroAddress.sin_len = sizeof(zeroAddress);zeroAddress.sin_family = AF_INET;return [self reachabilityWithAddress: (const struct sockaddr *) &zeroAddress];}
综上所述,不需要做任何修改,在iOS9上就可以支持IPV6和IPV4,但是在iOS9以下会存在bug,但是苹果审核并不关心 。
四、底层的 API如何同时支持IPV4和IPV6?
由于在应用中使用了网络诊断的组件,大量使用了底层的API,所以对于IPV6支持,这块是个重头戏 。如果你的应用中使用了长连接,其必然会使用底层 API,这一块也是需要支持IPV6的 。对于如何同时支持IPV4和IPV6,可以参考谷歌的开源库.
下面我针对我们的开源 网络诊断组件, 说一下是如何同时支持IPV4和IPV6的 。
开源地址:
这个网络诊断组件的主要功能如下:
4.1 IP地址从二进制到符号的转化
之前我们都是通过()进行二进制到符号,这个API只能转化IPV4地址 。而()能够兼容转化IPV4和IPV6地址 。写了一个公用的的转化方法如下:
//for IPV6+(NSString *)formatIPV6Address:(struct in6_addr)ipv6Addr{NSString *address = nil;char dstStr[INET6_ADDRSTRLEN];char srcStr[INET6_ADDRSTRLEN];memcpy(srcStr, &ipv6Addr, sizeof(struct in6_addr));if(inet_ntop(AF_INET6, srcStr, dstStr, INET6_ADDRSTRLEN) != NULL){address = [NSString stringWithUTF8String:dstStr];}return address;}//for IPV4+(NSString *)formatIPV4Address:(struct in_addr)ipv4Addr{NSString *address = nil;char dstStr[INET_ADDRSTRLEN];char srcStr[INET_ADDRSTRLEN];memcpy(srcStr, &ipv4Addr, sizeof(struct in_addr));if(inet_ntop(AF_INET, srcStr, dstStr, INET_ADDRSTRLEN) != NULL){address = [NSString stringWithUTF8String:dstStr];}return address;}