屏幕尺寸适配
2007 年,初代 iPhone发布,其拥有 3.5寸屏幕,运行 iPhone OS X。在后续几年中Apple 陆续发布了 iPhone 3GS,iPhone 4,iPhone 4S,iPhone 5C,iPhone 5S,iPhone 6,iPhone 6 Plus,iPhone 6S、iPhone 6S Plus,iPhoneSE ,iPhone7,iPhone7 Plus, 2017年9月将发布iphone 8。其运行的操作系统也从 iOS 4、iOS 5、iOS 6、iOS 7 、iOS 8, iOS 9,iOS10,iOS11。随着新版 iPhone,新版iOS操作系统的上市,随着维护的iPhone和IOS版本增多,如何确保 App适配新版iPhone及iOS操作系统?而这又是必须解决的问题,否则App将丧失新版iPhone新版iOS 系统上的用户,从而带来巨大的损失。 Apple 提供的解决方案之一就是:引入了点(point)的概念。在 iPhone 3GS 中, 1个点对应1个像素,点和像素两者在数值上是一致的。在iPhone 4/4S中,虽然机型变化,其荧幕宽高像素点增加了,但是其宽高点坐标是不变的。所以在开发过程中可以使用点绝对坐标,用来确定视图的位置。同时提供两套图片: ~.png 和 ~@2x.png。 iOS 系统将根据 iPhone 的像素来自动决定使用哪一张图片。
机型 | 屏幕尺寸 | 屏幕宽高(像素) | 屏幕宽高(点) | 模式 |
---|---|---|---|---|
iPhone 3GS | 3.5 | 320x480 | 320 x 480 | 1x |
iPhone 4 | 3.5 | 640 x 960 | 320 x 480 | 2x |
iPhone 4S | 3.5 | 640 x 960 | 320 x 480 | 2x |
iPhone 5 | 4 | 640 x 1136 | 320 x 568 | 2x |
iPhone 5C | 4 | 640 x 1136 | 320 x 568 | 2x |
iPhone 5S | 4 | 640 x 1136 | 320 x 568 | 2x |
iPhone 5SE | 4 | 640 x 1136 | 320 x 568 | 2x |
iPhone 6 | 4.7 | 750 x 1134 | 375 x 667 | 2x |
iPhone 6 Plus | 5.5 | 1080 x 1920 | 414 x 736 | 2.6x |
iPhone 6S | 4.7 | 750 x 1134 | 375 x 667 | 2x |
iPhone 6S Plus | 5.5 | 1080 x 1920 | 414 x 736 | 2.6x |
iPhone 7 | 4.7 | 750 x 1134 | 375 x 667 | 2x |
iPhone 7 Plus | 5.5 | 1080 x 1920 | 414 x 736 | 2.6x |
在iPhone5/5C/5S中,其荧幕,像素以及点,都已经发生变化。相比iPhone4/4S, 其荧幕宽度不变,高度增加88个点。在这种情况下,就不能再使用绝对坐标,否则将导致程序高度不够。如果App没有对其做适配处理,iOS 将对88个点均分为上下两部分,荧幕上下各出现44个点的黑边。在不同机型上,荧幕点坐标改变了,于是再也不能使用绝对坐标。为了彻底解决这个问题,iOS提出了一种新技术AutoLayout。使用AutoLayout技术,将不使用绝对坐标,而是指定View,button,TextField之间的相对位置,比如靠左多少,靠右多少,相距多少等。通过指定这一系列的约束条件,AutoLayout在荧幕上自动的画出对应布局。在iPhone5/5C/5S中,由于像素:点的比例仍为2,所以将直接使~@2x.png 图片即可。如果没有提供~@2x.png的图片,那么就直接使用~.png的图片覆盖同样的点。虽然点的数量一样,但是像素点却多了1倍,以致在这种情况下,图片显示会比较模糊。在iPhone6面世后,其荧幕大小坐标已经变化,宽,高都增加了。但是宽,高比不变,为9:16。而且其像素:点比仍然为2。在2x和3x的图片都不太合适。iOS的解决方案是:现有的银幕分辨率明显超过2x但没有达到3x,于是想象一个满足3x的银幕总可以吧? 于是App在iPhone 6 Plus上运行的时候,iOS会骗App说,App现在运行在一个 3x的荧幕上,其像素为1242x2208,点为414 x 736,而且都比iPhone 6要大。于是程序设计师和UED也按照3x来设计。UED 提供 3x 的高清图片,程序设计师依据414 x 736 来编写App。但是借来的总是要还的。iOS 在拿到这个假想 1242x2208 的绘制结果,再缩小到实际 1080 x 1920 荧幕来画图(通过某种缩小算法)。于是在 iPhone 6 Plus荧幕上看到的永远是缩小的图像。通过3x模式,使得设计开发过程得到了大大的简化。
CPU 指令集
机型 | ARM 架构 |
---|---|
iPhone 3GS | ARM V6 |
iPhone 4 | ARM V7 |
iPhone 4S | ARM V7 |
iPhone 5 | ARM V7S |
iPhone 5C | ARM V7S |
iPhone 5S | ARM V8(64) |
iPhone 6 | ARM V8(64) |
iPhone 6 Plus | ARM V8(64) |
iPhone 6S | ARM V8(64) |
iPhone 6S Plus | ARM V8(64) |
iPhone 5SE | ARM V8(64) |
iPhone 7 | ARM V8(64) |
iPhone 7 Plus | ARM V8(64) |
指令集是向后兼容的。比如ARMV7S指令集下生成的二进制包,可以运行在iPhone 6上,只是有些优化不可用,效率没有那么高而已。反之,ARM V8生成的二进制包, 就不能在 ARM V7S的iPhone 5上。 在编译二进制包的时候,需要确认其所能支持的ARM架构。如果希望App在各版iPhone上都能够高效运行,则需要将Build Active Architecture Only改为NO,Valid architectures选择对应的指令集:ARM V7 ARM V7S ARM 8。为各个指令集编译对应的代码,因此最后的ipa包的体积基本翻了3倍。如果希望App体积保持最小, 则现阶段应该选Valid architectures为ARM V7,这样Build Active Architecture Only选YES或NO就无所谓了。在ARM V8上,最明显的一个区别就是支持64-bit。于是在iOS上的数据类型发生了变化。数据长度的改变给App带来的影响之一就是: 当把一个值从大的数据类型拷贝到小的数据类型,数据可能被截断,例如从NSInteger 转换到int。
Architecture :指你想支持的指令集。Valid architectures :指即将编译的指令集。Build Active Architecture Only : 只是否只编译当前适用的指令集。
iOS 系统
每次iPhone机型的升级,往往同时伴随着新版iOS系统的发布。最开始的iPhone OSX,其创新的多点触控操作和极简的用户体验受到了用户的追捧。虽然初代的系统还存在各种各样的问题,比如无法复制粘贴等,但是它开启了移动设备操作系统的新时代。随着iOS 4增加了对Retina和多任务的支持,iOS 5带来了Siri 语音助手,iOS 6引入了全新的地图,iOS 7全新的扁平化图标界面设计,到iOS 8开始支持的Touch ID,iOS 9 Watch OS 2、App Thinning、3D Tought、分屏多任务,iOS系统在不断的更新(当然每次iOS系统的迭代更新,其对应的SDK也被推向开发人员)。发布上线的 App,必须考虑到对不同版本iOS系统的适配。因为在某一个特定时间点,并不是所有的用户都在最新版本的操作系统,比如有些用户在使用iOS 8,但总还是有一些用户停留在iOS 7,iOS 6甚至iOS 5。举例来说,相对 iOS 7 而言,iOS 8 中对内置相机做了改动----*调节进光量,在拍摄中,触摸屏幕对好焦点后,会在对焦框旁边出现进光量调节轴,增加或降低拍摄的曝光量,从而不必因为光的问题频繁找焦点测光了。值得注意的是::App AliExpress.com使用了调用了iOS拍照的功能,且其在iOS 7上工作中正常。在安装该App的iPhone升级为iOS 8之后,需要验证App的拍照功能是否工作正常, 确认其没有受到 iOS 8 拍照功能改动的影响。与之类似,和 iOS 7相比,iOS 8还有一些新功能,比如开放支持第三方输入法;锁屏推送中直接操作,而并不需要打开信息应用;多人群聊,实时位置共享,还可以发送语音和视频消息。根据这些iOS 8新功能,评估其对App风险。再而一一测试App上对应的功能。只有这些点都被测试通过之后,才能够宣布该App已经适配了iOS 8。
iOS系统 | iOS各版本市场占比 | 与前版本主要不同之处 |
---|---|---|
iOS 7 | < 8% | 1. 重新设计的视觉界面,扁平化文件系统 |
2. 全新的控制中心从下侧边缘滑出控制中心 | ||
3. 全新的MultiTasking设计,App预览及App关闭方式 | ||
4. 通知中心,锁屏下可以查看推送 | ||
5. Safari 升级,包括支持全荧幕浏览,左右切换等 | ||
6.其他多项新功能 | ||
iOS 8 | 15% | 1. 相机延时拍照,进光量调节 |
2. QuickType及第三方输入法 | ||
3. 交互式通知中心 | ||
4. Safari升级,向外切换到书签,分享链接 | ||
5. 即时聊天,群聊,位置分享,分享视频等 | ||
6. 其他多项新功能 | ||
iOS 9 | 77% | 1. 3D Tought |
2.应用内搜索 | ||
3. App Watch OS 2.0支持 | ||
4. BitCode App瘦身 | ||
5. App Transport Security(ATS) | ||
iOS 9 | 77% | 1. 3D Tought |
2.应用内搜索 | ||
3. App Watch OS 2.0支持 | ||
4. BitCode App瘦身 | ||
5. App Transport Security(ATS) |
开发策略
了解iPhone设备,iOS系统的适配原理,有益于App的开发。 在App开发阶段,将适配性作为代码的规范之一。从而能够在源头改善代码质量,提高App质量,降低App适配风险。其指导性策略如下: 1、布局相关:不使用绝对坐标,建议使用第三方(Masonry)进行相对位置设置。 2、通过点的概念,而不使用像素,来统一思考不同机器上的适配,为适配创造良好的基础。 比如要在view里面画一个44x44个点的按钮,2x模式,就乘以2,3x模式就乘以3。 3、调用系统API之前,需要考虑iOS的版本。 4、特定的API在不同iOS版本中,其功能,参数,返回数据可能有所不同。这些数据在对应的SDK中可以找到详情。所以在使用这些API之前,需要对这些功能, 参数,返回数据进行特殊处理。 5、iOS的某些特定版本,自身也存在一些bug。这些bug的详情在Apple Inc.官网www.apple.com中iOS的release document中有披露。在App设计中,要避免踩到iOS特定版本自身的 bug。
测试策略
依据上述的iPhone机型市场占比可以对其适配性专项进行优先级排序。市场占比最多的iPhone 5S,iPhone 6的优先级别最高,依次为 iPhone 5/5C,iPhone 6 Plus等。优先级别最低为iPhone 4S。在这些级别中,主要注意机型之间不同尺寸荧幕所带来的差别,包括分辨率,像素的不同。在App安装到这些机型上面后,其UI应该拉升或者压缩到满荧幕,不得出现空白区域或者某些部分不能显示。UI所对应的功能,与硬件相隔离,而一一工作正常。在编译二进制包而选择指令集,其包在跨机型上工作正常,App对指令集兼容。
App 在不同尺寸/分辨率/像素的荧幕手机下,其UI拉升压缩满整屏幕,视觉显示正常,对应功能正常。 基于不同指令集下编译的包,安装在跨机型上工作正常。 在iOS系统适配方面,根据各个iOS系统的改动功能点,和App上与之对应的相关功能, 一一评估其风险并验证。其中iOS 7和iOS 8之间的系统差异特别明显,需要特别关注。在App的适配测试中,需要同时考虑 iPhone和iOS系统两个维度,建议从代码层面深层次的分析问题。