作者:jingle 腾讯系统测试工程师
商业转载请联系腾讯 WeTest 授权,非商业转载请注明出处。

原文链接:http://wetest.qq.com/lab/view/285.html


一、背景

在 WWDC2015 大会上苹果宣布 iOS9 将支持纯 IPv6 的网络服务。2016年6月1号,所有提交到 AppStore 上的应用都必须支持 IPv6,否则将通不过审核。为了确保我们的 app 正常提交到苹果进行审核,不耽误项目进度,我们必须在提交到 AppStore 前对待提交 app 做 IPv6兼容测试

二、为什么要使用 IPv6

从 IPv4 到 IPv6,IP 地址的数量从 2 的 32 次方扩展到 2 的 128 次方,这个是 IPv6 碾压 IPv4 的地方,足够地球上的每粒沙子分配一个或者多个 IP 地址。当然,除了 IPv4 本身的原因(地址枯竭)外,下面提到的几点,也说明了 IPv6 比 IPv4 更加高效,例如:

  1. 避免了网络地址转换(NAT)的需要

  2. 通过使用简化的头提供了更快的路由通过网络

  3. 防止网络碎片

  4. 避免广播邻居地址解析

但最根本的原因莫过于苹果审核的压力,不得不将 app 适配 IPv6。

三、测试应该关注的点

1. 保证项目代码中使用的是更高层次的网络 API,避免使用 socket API

在苹果官网上,有这么一张图,说明了哪些框架支持 IPv6,哪些不支持, 如下图所示:

图中蓝色部分默认支持 IPv6,如果项目代码中使用的是 WebKit 或者 AFNetWorking 这些网络框架,那么需要改动的代码不会很多。

2. 走读代码中是否使用了 IP 地址

比如,检查代码中是否包含了类似于 192.168.0.1 的地址,如果有,需要换为其对应的域名地址。

3. 检查代码是否包含只适用于 IPv4 的 API

确保项目代码中没有以下 API:

inet_addr()

inet_aton()

inet_lnaof()

inet_makeaddr()

inet_netof()

inet_network()

inet_ntoa()

inet_ntoa_r()

bindresvport()

getipv4sourcefilter()

setipv4sourcefilter()

如果有了这些代码也不要怕,只需要将对应的 API 换为 IPv6 所支持的 API 即可,下表是 IPv4 和 IPv6 的对应关系表:

4. 本地搭建 IPv6 环境,回归 app 中所有网络请求的模块

我们现在连的网络,无论是 wifi 还是移动、联通、电信的各种不同类型的网络,都是 IPv4 的,也就是实际生活中和我们打交道的全是 IPv4 环境。但我们需要测试 IPv6 在 iOS APP 中的兼容性,是必然不能在现有的网络环境下测试的,需要测试人员自己构建测试环境。

值得欣慰的是,苹果公司在 MAC OS X 10.11 以后的系统中就埋下了开启 IPv6 环境的彩蛋。我们所要做的就是参照官方文档,在本地搭建这样的测试环境。即用 MAC 机建立一个热点,然后用 iPhone 连接该热点,回归待测模块。简单的示意图如下所示:

a)需要准备的设备:

系统是 OS X 10.11 以后版本的 MAC 机(该 MAC 机要使用非 WIFI 方式上网,且支持双网卡)一台,iPhone 手机一台。这个地方有些土豪同学可能会有疑问,我的 Mac 本本只有无线网卡,没有有线网孔啊,这时你就需要一个苹果 Thunderbolt 千兆以太网转换器,如下图所示:

b)开启 NAT64 网络

打开 “系统偏好设置”,按住 option 键的同时点击 “共享”,如下图所示:

之后,在共享页就能看到 “创建 NAT64 网络” 的可选框了,如下图所示:

到此,我们的 NAT64 网络就创建完成了,剩下的就是创建热点了。

c)在 MAC 机上创建 WiFi 热点

MAC 上创建 WiFi 热点,很简单,这里就不再详细说明了,看下面这张图也能知道怎么创建的:

这里想说明一点,也是比较关键的一点:点击上图中的 “启动” button 后,有些网络会出现如下图所示的共享失败情况:

出现这种情况,说明你当前使用的网络受到了 802.1x 协议的限制,无法共享。只能通过去 802.1x 保护或者换其他可以共享的网络进行共享。

如果是在公司网络,可以寻求 IT 进行网络切换,或者找开发他们搭建好的网络环境进行测试(ps:如果开发没有 IPv6 网络环境,且发版时间又比较紧张的情况下,可以和老大申请回家办公,或者随便一个咖啡馆)。

如果热点搭建成功,是可以在 mac 机右上角的网络状态处看到如下图所示的图标:

d)iPhone 手机连接创建好的热点,连接成功后,可以查下 iPhone 手机的 IP 地址。

我这里看到的是 169.254..的 IP 地址,这类地址属于保留地址,具体什么是保留地址,请自行百度。

e)回归待测 app,确保所有的网络请求在本地搭建好的 IPv6 网络环境下正常的,这里说的 “正常” 就是指和在 IPv4 网络环境下的表现一致。

经测试,在 IPv6 网络环境下,QQ 可以正常使用,微信网络连接失败(微信最新的 SDK 已支持 IPv6)。

最后,如果感兴趣的话,可以用抓包工具看一下,IPv6 的地址长什么样子,之前都是在课本中见到过,这次测试也算是头一次真正看到 IPv6 的地址啦,如下图所示:

四、项目实战

这里以地图 SDK 为例,简单说明具体的测试步骤。地图 SDK,是地图软件开发工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合,它包括接口 API、示例代码、支持性的技术注解或者其他的支持文档,有了这些,第三方开发者可以很方便的使用这些 API 开发自己所需的功能,这里附上腾讯地图开放平台地址:http://lbs.qq.com/ios_v1/index.html

目前和腾讯地图 SDK 合作的小伙伴有京东、58 同城、携程、嘀嘀等。

1. 首先需要分析该 SDK 使用到了哪些库

地图 SDK 中使用的 framework 如下图:

针对地图 SDK 中使用到的这些库,逐一确认是否支持 IPv6,比如 WebKit.framework 框架,苹果官方文档就明确说明了支持 IPv6。

2. 检查 SDK 源码中是否使用到了 IP 地址

这块主要是走查所有有网络请求的模块,是否将 IP 地址替换为了域名,这块一般是在代码某个配置文件中进行定义的。比如,下图所示的 server 地址:

3. 检查代码中是否包含只支持 IPv4 的 API

由于 SDK 使用的是 WebKit.framework,不存在底层的 socket API,这块没有风险。

4. 本地搭建测试环境,回归 SDK 网络相关模块

这里,需要保证在 IPv6 环境下的功能与在 IPv4 环境下表现一致的,就可以说明测试通过。

5. 抓包确认

最后,可以通过抓包看看是否真的走的是所搭建的 IPv6 的测试环境,当然也可以亲眼目睹下 IPv6 的 IP 地址长什么样儿。


【腾讯 WeTest iOS 预审工具】

为了提高 IEG 苹果审核通过率,腾讯专门成立了苹果审核测试团队,打造出 iOS 预审工具这款产品。经过 1 年半的内部运营,腾讯内部应用的 iOS 审核通过率从平均 35% 提升到 90%+。

现将腾讯内部产品的过审经验,以线上工具的形式共享给各位。在 WeTest 腾讯质量开放平台上可以在线使用。

点击链接:http://wetest.qq.com/product/ios 即可立即体验!


iOS 预审工具分四步进行预审服务

【一键扫描】只需提供 ipa 包、审核图片、审核视频、应用描述,即可在 4 小时内拿到一份完整的检测报告,定位问题的同时提供解决方案,助您成功通过审核。

【案例分享】集结 iOS 审核失败常见原因,丰富案例为您提供参考依据。

【专家服务】腾讯专家团队为您分析各种疑难杂症,提出最优解决方案。

【ASO 优化】专业优化 AppStore 内关键字搜索结果,让产品离用户更近一步。希望 App/手游在预审验收保证下,都可以快快乐乐过审,开开心心赚钱。


扫面下面二维码关注 “腾讯 WeTest” 公众号,获取更多干货:
这里写图片描述


↙↙↙阅读原文可查看相关链接,并与作者交流