Swift工程如何集成Static Library

咱们的iOS项目中使用了Swift+Objective-C的混合开发,很长一段时间咱们在Podfile中使用的是use_frameworks!,也就是把全部Pods作成Dynamic framework。 微信等第三方SDK以静态库.a的形式提供给开发者,致使咱们没有办法直接依赖,会报相似xxx has transitive dependencies that include static binaries的错误,所以咱们不得不把.a封装成动态framework而后才能经过Cocoapods集成到项目里。php

基本概念

  • 静态库:一堆目标文件的打包体。连接时会被完整的复制到可执行文件中,存在多个可执行文件中包含同一份静态库代码的问题。
  • 动态库:一个没有main函数的可执行文件。连接时不复制代码,程序启动后用dyld加载,而后再决议符号。因此一份动态库能够供多个程序动态连接,达到节省内存的目的。

坑一

Dynamic framework的制做过程网上有不少文章,我主要参考了组件化-动态库实战 这边文章。再次感谢文章做者@南栀倾寒 按这篇文章一步一步来基本能够完成90%以上的工做。之因此不是100%是由于咱们实际制做中遇到了CPU指令集的支持问题,须要特别关注如下几点:bash

  • Mach-O Type要选择Dynamic Library
  • Buld Setting中Other Linker Flags要加上-all_load,不然可能会致使部分文件没法集成到framework
  • Buld Setting中Build Active Architecture Only选No
  • 指令集合并,做者在文中附带了script,可使生成的framework同事支持模拟器和真机的CPU上容许,很赞! framwork作好后可使用lipo -info 查看所支持的CPU架构,显示出Architectures in the fat file: XXX are: i386 x86_64 armv7 arm64表示同时支持了模拟器和真机,能够拿来用了。

坑二

Dynamic framework打好了,经过Cocoapods集成到主工程。调试、运行一切OK。最终要打包上线时,果真挂了!!!error提示微信

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。最终在这篇文章找到了解决方案,泪牛满面。同时脑补了下-fembed-bitcode-marker和-fembed-bitcode,仍是以为收获满满。因而在制做Dy namic framework的工种的Bulid Settings中同时作了如下处理架构

  • Enable Bitcode = Yes
  • Other C Flags中添加-fembed-bitcode
  • User-Defined中添加BITCODE_GENERATION_MODE=bitcode

而后再次构建出新的framework集成到主工程中去Archive,这下,终于,稳了!函数

相关文章
相关标签/搜索