3.2 系统兼容
iPhone上的操作系统被称为iOS,每次发布新版本,想体验新特性的用户就需要将自己的手机进行固件刷新,或者购买已经配置最新系统的iPhone。操作系统的差异是手机“软实力”的差异。新系统发布给我们带来了新功能和接口实现的变化。
3.2.1 新增功能
什么是系统的新功能?发布每个大系统,除了界面更新外,必然伴随着一些全新的功能,升级了新系统后这些功能可以直观地被用户体验到。例如iOS 8带来的widget,支持第三方输入法,iOS 9带来的spotlight新特性,iOS 10的iMessage功能更新和Push消息多样化等。iOS平台上的开发者会根据这些新特性再结合自己的产品进行一些功能关联。
新增功能的测试只要在对应的系统和机型上进行针对性的验证即可,曾经出现缺陷的案例如下:iOS 8系统widget的功能,主要在于App自身提供给widget一些信息,例如天气、资讯新闻。测试过程中发生一些显示排版的问题。iOS 9系统引入spotlight新功能可以搜索应用内的信息,这方面的Bug集中在数据传输中。曾发生过书签数据传输错误导致的闪退问题。iOS 10系统到目前为止还没有发现新增功能引发的问题。
3.2.2 接口差异
系统发布的同时,还有与新增功能对应的一些用户看不见的变化。一般来说,是对开发者而言的变化,大多体现为系统接口的变化,以及一些和过往不同的API出现,这里称为系统的接口差异。
新系统发布后,iOS产品的开发工具Xcode也会进行更新,提供新的SDK供开发者进行编译。而使用新SDK编译的版本在旧系统上也可能会存在各式问题,主要是SDK底层的API实现会做一些调整,需要开发者阅读新系统说明,旧有代码对新系统的API实现要进行适配,以免出现各式问题。
因为系统一般是一年发布一个大的版本,按照一年中不同的时间阶段,大约会有如图3-1所示的三个测试阶段。
图3-1 研发阶段
1.日常兼容
一款App在编码阶段就要考虑不同系统的差异性,在修改代码的阶段要格外关注系统的高低版本之间API调用时实现的差异。
表3-1是QQ浏览器(iPhone)在非新系统发布时期的普通适配测试发现的问题。
从表3-1中可以看出,两个Bug都是某个系统下的浏览器不响应用户手指操作。点击开关,不响应开关命令;滑动屏幕,不响应滚动命令。其本质是因为开发在重构或者实现函数功能时,忽略了高低版本系统上的系统API调用的差异性。
这种情况一般发生在函数重构阶段,重构的开发在不了解系统差异性的情况下,容易出现这样的问题。作为测试人员,对每次重构类型的测试,尽量做到系统覆盖。如果条件允许,最好与开发一起过一下高低版本系统API实现是否有差异性。
2.发布新系统
在每年的新系统发布前,苹果公司会陆续发布Beta版本供开发者适配。这时测试也要跟进,对App在新系统上运行的情况进行检查确认。时机一般是在开发完成一轮适配测试后开始启用。原则上是所有的功能都要在新系统上运行一次检查。在启动测试工作之前,测试人员最好也要了解新系统的特性及其变化。
下面还是以QQ浏览器(iPhone)为例,如表3-2所示。
Bug 1如图3-2所示,其中左边的图是手机通知栏中浏览器下发的消息,点击这条消息后进入右边的图,可以发现上方本应该显示手机的网络信号、电量、时间信息的状态栏不显示了。
图3-2 通知栏Bug图
这是iOS 9正式发布前的Beta 3版本自身的问题,我们可以对这个问题进行兼容,在iOS 9正式版本发布后这个问题也不复存在。
Bug 2的现象如图3-3所示,其中左图中的下方工具栏有一个“收藏到QQ”,点击后会提示登录QQ(已经登录过QQ),现象如右边的图所示。
图3-3 收藏到QQ功能Bug
这是iOS 9基于安全性考虑,不允许扫描用户手机里App的安装情况,必须在URL scheme里指定调起的App(URL scheme一般使用的场景是应用程序有分享或跳转其他平台授权的功能,分享或授权后再跳转回来)。
在iOS 8中并没有做过多限制,但是iOS 9需要将在外部调用的URL scheme列为白名单,才可以完成跳转。如果iOS 9没做适配,则会报错。具体的解决方案是要在info.plist中设置 LSAPPlicationQueriesSchemes类型为数组,下面添加所有用到的scheme,如图3-4所示。
图3-4 工程配置
上述两个Bug,主要是在新版本适配前的Beta版本的测试过程中发现的。这个阶段,测试要随开发一起学习新系统的特性,多多阅读相关文档,联系产品各项功能检查。新系统上的UI显示问题,大部分也是由于旧版SDK上的编译导致的,例如iOS 9上的字体变化了,但是旧的SDK还是按照之前的方式进行编译,就会出现省略号的问题。
3.启用新SDK
在新系统发布后一段时间,开发人员会采用高版本的SDK编译,比较显式的是用高版本的Xcode来编译版本。这里有个问题,就是如果使用高版本独有的API,编译器是不会标识出来的,而低版本系统并没有这种API,因此运行在低版本上就会出现问题。
QQ浏览器(iPhone)项目曾经出现过3D Touch重压菜单点击后不能跳转到App内对应的内容上。原因就是新版本SDK引入的适配问题。
浏览器创建Quick Action(用力按压App图标出现的标签)采用的是静态方式,静态创建方式是在info.plist文件中声明的,其中有两个键值是必须设置的。
UIAPPlicationShortcutItemTitle:表示这个键值设置标签的标题。
UIAPPlicationShortcutItemType:表示设置一个快捷通道类型的字符串,这个字符串唯一地标识出这个通道类型。
点击3D Touch中的快捷选项,会先启动浏览器,然后根据回传的type参数即标识通道类型的字符串来确认需要跳转的模块页面。在更新iOS 10系统的SDK后,系统会在Quick Action里自动添加widget入口,同时系统在回调type参数时会在原字符串前面自动添加一个字符串“com.tencent.mttliteextension”,即浏览器的Bundle ID,如图3-5所示。而在回调函数中,我们还用原字符串“search”“new page”“history”去匹配,全部匹配失败,所以启动浏览器后不再做任何处理,就不会跳转到相应页面了。
图3-5 参数形式截图
上述三个阶段产生的适配问题主要是因为新系统淘汰或更新了一些API,如果开发人员在这些地方不注意,就会出现上述问题。这里测试人员可以做的工作是与开发人员一起学习每个系统的特性—关联产品特性。例如,iOS 9上关于URL scheme的规定涉及外部App调用,那么测试人员可以排查所有涉及外部App调用的功能,避免开发人员遗漏。本章中的案例就是开发人员忽略了工具箱中收藏的QQ功能也涉及外部App调用(QQ账号调用)。
不同系统接口差异引发的API适配是适配测试重点关注的问题,无论是API更新、淘汰,都会导致适配问题,关注API变更是测试人员和开发人员都要做的。测试人员对缺陷要知其然,更要知其所以然。