最近在用Swift重构公司项目,数据库方面还是想用FMDB,但也想看看混编之后包会增长到多大,于是在没有引入FMDB时先进行了一次打包。让我吃的是,打出来的包居然有110M+,这还是没有编写任何复杂逻辑的情况。为了探究为何会出现这一现象,我做了如下实验:
1.使用xcode重新创建一个Swift项目Test,打包发现只有100k左右。
2.将Test按照公司项目的配置通过CocoaPods导入相同的三方库,打包发现还是只有100k+,说明和CocoaPods没有关系.
3.通过Xcode->Organizer-> 在公司项目打包的文件上面右键选择“Show in Finder” -> 在Finder中的文件上右键选择“显示包内容”,对比Test项目,发现公司项目目录下多了一个SwiftSupport文件夹,里面包含了Swift的核心动态库文件,如图:
Swift打包的IPA过大
可以看出,IPA主要是被这部分"带大"的。
4.经过仔细对比,最终发现是因为公司项目在Build Settings里面设置了iOS Deployment Target为9.0。若设置为12.2以上的系统,则IPA包不会包含这些动态库;但如果设置低于12.2,则IPA包会包含这些动态库。
5.这种现象我在 Stack Overflow:IPA generated by swift is so big, about 5MB上找到了原因:

The libraries containing the entire Swift language have to be embedded in the IPA. Those libraries are part of the app, not part of the system - because Swift has to work even with backwards compatibility, in part because it is constantly changing (independently of system updates), and in part in order to work on iOS 7 (where the system has never heard of Swift). And they are about 5MB in size.

总结起来就是一句话:由于Swift语言的不稳定性,为了向后兼容,IPA包需要包含完整的Swift动态库。