App Thinning

Overview

从iOS 9.0.2开始,苹果正式支持了App Thinning,文档在这里:App Thinning (iOS, tvOS, watchOS)

配置xcassets

之前一直觉得已经完全启用了App Thinning,不过今天才发现自己漏掉了一点:忘记使用xcassets来管理图片资源。

上图中Media.xcassets存放了所有的图片资源,Images.xcassets存放了AppIcon和LaunchImage。

AppIcon可以使用plist配置,也可以使用xcassets来管理,推荐后者。

这样存放时,可以很容易地以UIImage的方法来读取,只要选取对应的分辨率(取pt前的数字)就行

格式为:

let image:UIImage = UIImage(named: "AppIcon60x60")

参考链接:how-to-get-uiimage-of-appicon

把原有的图片转换到xcassets也很简单,在工程中添加一个新资源文件Asset Catalog,然后选中它,右键import from project,即可导入。

注意:所有的图片资源,如果区分分辨率,需要严格按照@2x与@3x的形式命名,否则在导入时,可以会出现2x图放在1x图中的情况,这时需要手动修改,最简单的方式是先复制出图片文件,修改名字,删除原来的文件,再重新添加到xcassets中。

区别

使用与不使用xcassets有什么区别?

不使用的话,App Thinning只会默认启用bitcode与on-demand resources(前者会在手机上下载对应架构的二进制文件,后者感觉多用于按需加载游戏资源),如果是越狱手机,可以从AppStore下载应用后导出,解包后会发现里面还是有全部的图片资源,在代码里也可以使用按路径加载图片的方法。

使用后,所有的图片资源会被统一打包成Assets.car文件,代码里只能使用**UIImage(named: "xxxx")**的方法加载图片,而引用的第三方库中的Bundle文件会保持原样,不会拆分出2x图与3x图。

当在电脑上从ITunes上下载应用或者在Archive后,导出应用时选择所有设备,ipa文件会很大,解包后,会包含所有的资源,即32位,64位的二进制文件,所有分辨率的图片资源。

当在手机上的AppStore下载应用或者在Archive后,导出应用时选择了特定设备的,ipa文件较小,解包后,只会包含对应架构的二进制文件与对应分辨率的图片资源。

所以ITunes备份手机ipa的功能自然也没用了,除非ipa文件包含所有资源,否则无法兼容所有设备。

assets.car文件的解压可以使用这个工具:github.com/steventroughtonsmith/cartool,需要编译后使用

也可以使用brew cask安装这个软件:asset-catalog-tinkerer

最后,就算采用了AppThinning,只要用了Swift,就会把一套运行时打包进去,应用的体积就会变成一个噩梦,更蛋疼的是AppStore上显示的应用大小是安装后的大小。