Swift Static Framework in CocoaPods

💡
Updates - 2018-12-25 把 Static Library 改为 Static Framework - 2018-09-19 更新了 patch Podfile 的脚本

CocoaPods 1.5 is amazing!
CocoaPods 1.5 在前一段时间 release 了,其中有一个对于使用了 Swift 的项目非常重要 feature,那就是支持了 Swift 的 Static Framework。
 
这还要讲讲 Swift Static Framework 的历史。在 Xcode 9 之前,并不支持 Swift Static Framework;Xcode 9 之后支持了 Swift 的 Static Framework,但是使用 Swift + CocoaPods 的项目并没有办法使用 Static Framework,因为 CocoaPods 不支持。在 CocoaPods release 1.4 版本 的时候,终于支持了在 use_framework! 的情况下使用 Static Framework,但是对于 Swift 和 Objective-C 混编的项目还是未能完美支持;终于在 1.5 版本,Swift 的项目能用上 Static Framework 了!
为什么这件事情令人兴奋呢?这还得从 Dynamic Framework 说起。Apple 官方推荐每个 App 使用 Dynamic Framework 的数量是 6 个,这是有原因的。因为在 App 启动的时候,dyld 会load 这些动态库,这会造成启动时间的增加;而且动态库数量过多,还会在 iOS 9 的设备上造成 dyld 的 crash。所以使用 Static Framework 应该是每个使用了 Swift + CocoaPods 的项目都期望的事情。
在 CocoaPods 还未支持这件事情的时候,可以使用 cocoapods-amimono 这个插件。它会把所有 Dynamic Framework 的符号拷贝到最终程序的可执行文件中,解决上面出现的两个问题。
既然使用动态库有这样那样的问题,那在升级了 1.5 以后,全都使用静态库不就好了?事是这么回事,但使用静态库也不是完美的,因为你还可能会遇到这样的问题:
等等,不过都比较好解决,不像 Dynamic Framework 那样有硬伤。
总体上来说,使用静态库还是比动态库有优势的。
然而要想在项目中使用这个 feature,需要在 podspec 显示指定 s.static_framework = true,对于集成 100 多个 pod 的项目来说,一个个改起来太麻烦了,也不现实。但是 CocoaPods 是 Ruby 写的呀,我们可以通过 patch CocoaPods 来实现在只写几行代码的情况下,把所有 pod 变成 Static Framework,
得益于 Ruby 的动态性,我们可以直接在 podfile 中书写以下代码,实现静态库的 patch 而不需要修改 podspec,
pre_install do |_|
  Pod::PodTarget.send(:define_method, :static_framework?) { true }
end
这样对于 PodTarget 的 patch 就会在 pod install 的时候生效,所以我们就不需要改每个 pod 的 podspec 就可以实现每个 pod 都是 static_framework 的效果了,enjoy~

© Xinyu 2014 - 2024