iOS静态库(.framework)问题汇总

一、bitcode bundle could not be generated because ' XXXX' 错误

这类错误是由于静态库不支持bitcode而你自己的工程支持bitcode,解决方案有两种:

1、让静态库支持bitcode:Target -》 Build Settings -》Other C Flags 添加 -fembed-bitcode

注意:(更详细的可自行百度)

确保打包的时候使用的是fembed-bitcode, 而不是fembed-bitcode-maker 

fembed-bitcode-maker:只是简单的标记一下在archive出来的二进制中bitcdoe所在的位置。

fembed-bitcode: 真的会生成bitcode指令,并且嵌入到二进制中

2、自己的工程关闭bitcode:Target -》 Build Settings -》Enable Bitcode 设置为NO(xcode9 默认创建的工程Enable Bitcode为YES)

二、调用framework中的方法或framework内部调用方法导致unrecognized selector sent to class XXXX 错误

此类问题多半是由于静态库添加了Category导致的,需要在自己的项目中配置,Target -》 Build Settings -》Other Linker Flags 添加-ObjC

-ObjC原文链接

解决这个错误的方法就是:将Category的方法链接到APP中,这样APP运行时,就能够找到对应的selector。而 –ObjC就可以完成这个任务。

 "-ObjC"的作用是:将静态库中任何Objective-C代码都链接到APP中。任何Objective-C代码当然也包括Category的方法。可以看出,使用-ObjC可能会链接很多静态库中未被使用的Objective-C代码,极大的增加APP的代码体积。

"-ObjC" 的兄弟

和 "-ObjC"作用类似的有以上的五种方案。可以看出,从增加APP代码体积来看,伪符号方案增加得最少"Perform Single-Object Prelink"、 "-force_load" 和 "–ObjC" 次之,"-all_load" 增加得最多。         在开发iOS SDK时,为了方便使用者手动集成,最好是减少使用者需要配置的信息,所以"伪符号"方案和 "Perform Single-Object Prelink"方案是推荐的。另外,第三方SDK常常是闭源的,对于使用者来说,伪符号是透明的,所以从简便性角度看,推荐"Perform Single-Object Prelink"方案。

遇到问题会持续补充...

推荐阅读更多精彩内容