动机:
所在项目封装的framework基本都是OC写的,希望在旧的项目中逐步用新的技术迭代。但是Swift和OC混编有两个比较重要的问题。
- Swift ABI不稳定
- 会带来APP体积的明星增加,iOS 8 的时候是夸张的 8M
而这次的xcode 10.2.1 的更新带来了一些变换:
因为Swift 5.0 之前的ABI (application binary interface)并不稳定,所以导致Swift的runtime没有包含在iOS系统之中,而每次APP打包都会带上Swift的runtime,这样就会造成带Swift的APP体积增长非常明显。这个问题随着xcode 10.2.1 和 iOS 10.2的发布解决了:
看Xcode 10.2.2 版本是怎么说的:
1 | |
重点:苹果表示Swift 不再动态链接Swift标准库,这些标准库内置在 iOS 12.2 系统的各种设备中,这样就可以减小APP Store 中可以下载的APP 体积。
所以想尝试通过OC和Swift混编,看看体积的影响。
过程:
- 将OC导入Swift:framework中不能创建 Objective-C Generated Interface Header,如果framework是静态库,可以直接调用OC的类,如果是动态库,目前会报找不到文件错误,正在研究如何解决
-
在Objective-C中使用Swift : 非常简单,在使用OC的代码中导入文件
#import <ProductName/ProductModuleName-Swift.h>;在 - 写完的framework提供给纯OC的项目调用,记得把Swift标准库带上
1 | |
需要在build Setting中设置
1 | |
1 | |
按照我的理解,实际上还是把Swift一些标准的动态库库给包含进去了……
体积影响:
framework with Swift 对体积的影响,
关闭bitcode,加入Swift版本,关闭bitcode:
| Device Type | Download Size | Install Size |
|---|---|---|
| Universal | 17.8 MB | 31 MB |
| iPad Pro (9.7-inch) | 13.5 MB | 21.9 MB |
| iPhone XS | 13.5 MB | 21.9 MB |
关闭bitcode,关闭Swift,关闭bitcode:
| Device Type | Download Size | Install Size |
|---|---|---|
| Universal | 12.8 MB | 17.5 MB |
| iPad Pro (9.7-inch) | 11.2 MB | 14.8 MB |
| iPhone XS | 11.2 MB | 14.8 MB |
可以看到:如果第三方APP是纯OC的项目,引入Swift会导致下载体积增加 2.3M,安装体积增加7.1M。
结论:
如果是封装framework给自己用,我觉得增加的2.3M体积已经完全可以忽略不计,可以迁徙到新的技术上去,用Swift提高效率,编写更好的代码。
但是如果是对framework的体积大小非常敏感,从目前结果来看,混编Framework还是不能达到预期。