6月9日结束的苹果WWDC15大会上,苹果公司推出了多个新技术,不过对于手游开发者们来说,可能最具有革命意义的是库克在发布会现场都没有提到的应用瘦身功能(App Thinning),它是其Xcode 7测试版的功能之一。 按照苹果官方的解释,应用瘦身功能分为三个部分:首先是分割功能Slicing,它可以对应用/游戏内容进行分割,根据用户设备类型和屏幕分辨率的不同分发定制化下载包,开发者只需要把完整应用包的内容上传到iTunes Connect即可。
另外,该功能还包含了中间代码功能(Bitcode),可以让苹果在未来为你的应用进行再次优化,而避免了发布新版本的麻烦,同时可以大大减少调试工作量。 应用瘦身的第三个功能就是on-demand资源,开发者可以把应用初始化用不到的资源分类打包上传到App Store,在用户使用的时候系统会根据资源标签在必要的时候调用资源,当某些资源不再使用的时候会被系统自动清除,这样不仅减少了应用下载和加载时间,还大大缩小了安装包体。
对于开发者们来说,这个功能可以减少很多的bug调试时间,让游戏包体变得更小,提高各种设备用户的游戏体验。可以说,苹果的这个技术在很大程度上解决了不同设备的性能差异问题,实现了one-for-all的需求。不过Gamelook认为这个功能如果安卓渠道可以用的话,就会大大降低设备碎片化给开发者们带来的适配难题,拉近和iOS设备之间的差距。
以下请看Gamelook整理的应用瘦身功能以及On-demand资源内容的详细介绍(更多详细内容请参考官网英文地址):
第一部分:应用瘦身以及其功能
App Store和操作系统(iOS和watchOS)根据用户特定的设备能力量身优化应用安装,以达到最低的设备空间占用。这个优化的过程,就被成为应用瘦身,它可以让你创作的应用利用大多数的设备功能、占用最小的磁盘空间并且为苹果公司未来的更新进行调整。更快的下载速度和更少的空间占用可以带来更好的用户体验。
本章节描述的是应用瘦身的3大组件:应用分割(Slicing)、中间代码(Bitcode)和On-demand资源(Resources)。
应用分割功能(Slicing,仅针对iOS平台)
Slicing就是创造并传输为不同目标设备而设计的变体应用包(variant,以下简称定制化下载包)的处理过程。一个定制化下载包仅包含针对特定设备所需要的可执行架构以及资源。你可以继续开发并且把完整版本的应用上传到iTunes Connect,然后App Store会根据玩家设备类型和分辨率创造并传输对应的应用。这里,你可以认为资源根据玩家设备分辨率和类型的不同而分割成了多种类型,GPU资源也根据设备能力进行了切分,当用户安装应用的时候,他们可以下载并安装适合自己设备的定制化应用包。
Xcode会在研发过程中模拟分割,所以你可以在本地创作并测试定制应用包,当你在一个设备上研发并运行应用的时候,Xcode会对其进行分割,当你创造一个档案的时候,Xcode会包含完整版的应用,但允许你从档案中输出不同的定制应用包。
提醒:对于iOS应用来说,应用分割仅支持最新版本的iTunes,以及运行iOS 9.0或者更高系统的设备,否则的话,App Store将会为用户分发统一的安装包。
分割功能流程图
应用分割是在研发过程和分销过程中进行的,基本处理程序如下:
1.在Xcode里,定位目标设备并在资源目录中提供多种分辨率图形,你必须使用资源目录这样才能进行分割。
2.在模拟器或者一个设备上研发并运行应用。
3.Xcode会为选定设备类型生成变体包,提高调试销量并允许你在本地设备进行变体包测试。
4.创建应用档案并为特定设备输出对应的变体应用包。
5.在目标设备测试所有的变体包以更早的发现硬件配置方面的问题。
6.把应用上传到iTunes Connect。
7.App Store从档案中创建单独的应用定制包,定制包的数量取决于Xcode项目中所存在的架构和资源的数量。
8.在iTunes Connect当中,向制定测试者们分发测试版的应用。
9.测试者们通过TestFlight在你的应用所支持的设备上安装测试版本,TestFlight会根据用户设备的不同而下载特定的变体应用包。
注意:为了测试App Store在应用发布之前为你创造的变体包,最好是只邀请内部测试者(你团队里的iTunes Connect用户)并且使用TestFlight下载变体包。如果邀请了外部测试者(比如只通过邮箱地址登录),那么他们就必须等待Beta App Review在他们下载变体包之前通过了你的应用。
10.然后在iTunes Connect里发布你的应用。
11.用户在应用支持的设备上进行安装,App Store应用下载会根据用户设备类型分发变体应用包。
中间代码功能(Bitcode ,适用于iOS和watchOS)
Bitcode是一个已编译程序(Compiled Program)的中间代码(intermediate representation)。如果你上传到iTunes Connect里的应用包含bitcode的话,就可以被编译和链接到App Store。加入Bitcode可以让苹果在未来对你的应用二进制(app binary)进行再次优化,而不需要你向App Store提交新版本。
注意:对于iOS应用来说,Bitcode是默认但可选择的。如果你提供Bitcode,那么应用包里的所有应用和框架都需要加入Bitcode,而watchOS应用则必须加入Bitcode。
On-Demand资源(适用于iOS系统)
On-Demand资源指的是你可以通过关键词和命令的方式进行分组归类的资源,比如图像和音频,App Store会把这些资源放在苹果服务器上并且为你管理下载。On-Demand资源可以加快下载速度并缩小应用包体,提高用户的首次登录体验。比如,一款游戏应用可以根据等级和任务的不同把资源分组,在玩家达到下一个等级或者完成一个任务之后才会用到后续的资源,同样,应用也可以只在用户进行IAP购买的时候提供对应的资源。
当一些on-demand资源不再需要而且磁盘空间较少的时候,操作系统会自动清除它们。如果你在App Store之外对自己的应用进行测试或者分发,那就需要你自己来管理这些On-Demand资源。需要注意的是,可执行的on-demand资源是不支持的,App Store也会对on-Demand资源进行分割(即上面说过的Slicing),进一步提高用户体验。
对于用户们来说,on-demand资源是以透明的形式在后台运作的,当用户需要对应功能的时候,这些资源就会被提供。
第二部分:什么是On-Demand资源
提示:这是一个正在研发的API或技术的概要文件,苹果公司提供这些信息主要是为了帮助你通过苹果产品使用这些技术或者编程界面而做好计划,该信息有可能会在未来发生改变,本文当中提到的软件应该以最终发布的操作系统测试和最终文档为准,未来有可能会提供新版本的文档信息。
On-Demand资源指的是寄存在App Store并与应用下载包分离的应用内容,使用On-demand资源可以让应用包体更小,安装时间更短。
本部分文档主要是提供你的应用使用on-demand资源所需要的信息。在阅读本文档之前,你首先应该熟悉资源编程,想要获得更多信息,请参考资源编程指南。
On-Demand资源是有生命周期的
On-Demand资源可以让应用包体更小,下载速度更快,应用内容更丰富,主要是通过在App Store存储资源的方式实现,与你的应用包体是分开的。
苹果操作系统会根据你的应用请求而管理on-demand资源的下载和存储,基本运作流程如下:应用请求资源-使用资源-然后释放请求。被下载之后,这些资源会通过多次登录而留存在用户设备上,让应用体验更快。
On-Demand资源是默认自动开启的,前提是你的项目支持对应的OS版本。
标签主要用于辨识和对on-demand资源进行分组。
在研发过程中,标签用于辨识和分组on-demand资源,标签名字可以用于辨识资源和应用的关系。Xcode会提供创造和管理标签的工具,同时在应用被安装之后或者安装完成之后指定特殊标签。
在运行期间,应用负责管理标签。
应用请求会通过操作系统获得标签,然后系统会下载并检查组件资源并且下载所有不存在于用户设备上的所需资源。在此过程中,应用可以追踪下载过程,如果有必要还可以调整优先级。
标签被使用完之后,在从存储中移除标签的时候,应用可以设定一个系统预留优先级,优先级较低的标签会首先被清除。
在与系统互动的时候会用到2个classes:NsbundleResourceRequest用来管理标签的使用、追踪下载并调整下载优先级;NSBundle的一个扩展class被用来设定标签的预留优先级。
On-demand资源可以是多种类型,但可执行代码除外。
有关资源的一些信息
在电脑程序中,资源指的是和程序的可执行代码同时存在的数据文件。有了资源文件,你的代码就可以极大的简化,不必通过创造复杂的数据或者图形设置写复杂的代码。比如,和用代码按像素形式来创造图像不同的是,在图形编辑器中创造资源可以更加有效率和实用。为了充分利用资源的优势,你的代码只需要在运行的时候加载并使用即可。
除了简化你的代码之外,资源还是所有应用国际化管理非常重要的一部分。你在应用里不需要编写字符串并以及其他用户可见的内容,你可以把这些内容放在外部的资源文件里,这样本地化应用的时候就变得非常简单,你只需要为每一种所支持的语言创造新版本的资源文件即可。OS X和iOS也使用了这样方式管理本地化资源,根据用户的偏好语言加载需要的资源文件。
本文件提供有关OS X和iOS系统支持的资源类型信息以及你如何在写代码的时候使用这些资源的指导。本文件并不针对资源创作过程,大多数的资源都是通过第三方或者开发者自己的工具提供,另外,尽管本文的讲述的是应用中的资源使用,但这些信息同样适用于其它类型的可执行包,包括框架和插件。
在阅读本文档之前,你需要熟悉应用包体的组织结构,理解这个结构可以让管理变得更容易,并且寻找你的应用所需要使用的资源也更为便捷。
应用可以包含很多类型的资源,但有些资源是由iOS和OS X直接支持的。
Nib文件存储你的应用的UI对象
Nib文件是用来创作iOS和Mac应用的经典文件类型,一个nib文件就是你希望在运行期间重新创作的一系列freeze-dried对象数据档案。Nib文件通常用于存储预置的窗口、视图以及其他可视化对象,但是也可以用来存储非可视化对象,比如controllers。
你可以在Xcode中通过Interface Builder编辑Nib文件,它可以提供一个i额图形编辑器来管理对象。当你随后把一个nib文件加载到应用中的时候,nib加载代码会实例化文件中的每一个对象,并且会把它重新存储于你在Interface Builder中所定义的state中。这样,你在Interface Builder中看到的就和应用运行中所看到的内容一致了。
字符串资源包含可本地化的文本。
在iOS和Mac应用中,图像、音频和影响资源的重要性很高,图像可以用来创造独特的视觉风格,音频和影像文件同样可以强化整体的用户应用体验,同时可以简化代码。两种操作系统都支持加载并在应用中呈现这些资源。
哪些应用适合使用On-Demand资源功能?
On-Demand资源指的是和应用下载包分离并且存在App Store上的应用内容,应用请求一系列的on-demand资源,操作系统管理下载和存储。可以使用on-demand资源获得优势的应用包扩:
1.初始化资源延迟加载的应用,这些应用的一些资源属于应用的主要功能,但在初次登录的时候却用不到,资源会被标记为需要初始化,当应用运行的时候,操作系统会自动下载这些资源,比如图形编辑应用。
2.应用资源需要延迟加载的应用:这类应用只在特定情况下使用一些资源,比如在一个带有很多关卡的游戏中,只有玩家们进入特定的关卡才需要使用对应的资源。
3.需要远程存储低使用率资源的应用:这类应用的有些资源使用率非常低,只有在需要的时候才加载这部分资源。比如有些应用的新手教程资源只有在第一次打开应用的时候才会用到,以后可能再也不会用到,后来的一些功能教学也只是用到的时候才加载,随后再也不使用。
4.需要远程存储IAP资源的应用:这类应用通过IAP提供额外的资源,这些资源只有在用户购买的时候才会被用到,比如,一个用户购买SuperGeeky表情包的时候,这个表情资源才会被用到。
5.首次登录需要加载资源的应用:这类应用有些资源是只需要初次登录的时候才加载,并且在重复登录的时候用不到。比如一个只有在首次登录时才加入教学内容的应用。
在研发过程中,开发者可以为on-demand资源分配一个或者多个标签,也就是你用来辨识特定资源的字符串,你可以通过标签的名字来决定对应资源在应用中的使用,比如游戏中第五级采用到的资源可以用与level5相关的标签。
On-Demand资源的循环周期
带有标签的资源使用流程大致如下:
带标签的资源被存储在App Store里-应用通过标签请求使用资源-系统下载资源包-保存资源包-使用完成后系统释放资源包。
存储大小限制
App Store对于on-demand资源使用是有存储空间限制的,具体请参考下表。