背景介绍:
iOS客户端使用了Objective-C和Swift混编,在Xcode9(2017年9月发布)之前苹果不支持使用Swift Static Libraries。 同时,我们使用了CocoaPods进行项目管理,对于Swift+CocoaPods的项目直到2018年4月发布的Cocoapods1.5.0才官宣支持把Swift Pods构建成Static Libraries。所以在CocoaPods1.5.0之前我们一直使用的是Dynamic frameworks。
动态库与静态库的区别、优劣不在本文讨论范围之内,相关的文章网上可以搜到很多。本文主要记录了我们为什么要转向转向Swift Static Libraries ,以及迁移过程遇到的一些问题和思考。
Dynamic frameworks的困境
-
很多第三方库(如WechatSDK)是以静态库的方式提供给开发者,这就导致我们没有办法直接接入。在执行
pod install
的时候会产生has transitive dependencies that include static binaries
d的error。所以一直以来我们都是苦逼的作一层包装,把第三方库做成私有的Dynamic framework然后接入到工程中(如果谁有更好的处理方法,希望得到指导)。然而,就是这个二次包装的过程我们也踩了很多坑,其中印象深刻的是Archive的时候遇到了bitcode问题。调试运行正常的代码在最终打包预备发布的时候遇到下面错误:
bitcode bundle could not be generated because xxx was built without full bitcode. All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture armv7 复制代码
记得当时翻了一下午Google,最终在这里找到了答案,是对BITCODE_GENERATION_MODE
没有正确设置,在这里再次感谢一下文章作者。
-
公司其他业务线大多使用的是Static Libraries,不管是出于代码复用或者产品需求,想要使用他们的SDK也会遇到第一个问题。要求他们同时提供和维护动态库版本也不太现实,这就产生了我们与其他业务线在技术栈上的一个差异。