向Xcode项目添加“动态”框架的几种方法

如何在Xcode项目中添加动态库?

首先,我们知道对于”。一个静态库”和“静态框架”,我们可以直接拖动相关文件到项目中,并勾选复制,如果需要的选项,没有其他额外的设置;

添加“动态框架”有点麻烦,主要有以下几种方式。

PS:这里说的“添加动态库”是指第三方动态库,而不是UIKit.framework、Foundation.framework或libc++等系统自带的动态库。一般直接添加它们的依赖关系是很简单的->;单击链接的框架和库中的加号进行搜索和添加。

在Xcode项目中选择app对应的目标,然后在常规->中选择;点击Embedded Binaries下的加号,如图1,在弹出的窗口中选择Add Other…,最后在Finder中选择想要添加的“动态框架”,需要的话勾选Copy。需要注意的是,你不能拖动。框架文件直接放入Finder中的嵌入式二进制文件中,否则会得到一个错误。

关于手动添加动态库和遇到问题的解决方案的更多细节,请参考苹果官方教程:在App中嵌入框架。

但是!这种方式看似很方便,其实有个坑:我们上一集提到过,一般的动态二进制文件会包含很多处理器架构,比如i386、x86_64、armv7、armv7s、arm64等。,然后Xcode直接将动态二进制文件复制到。编译链接时的ipa包。不使用的架构不会像链接静态库一样被过滤掉,苹果也不允许将包含i386、x86_64等仿真器架构的包上传到App Store Connect后台,这样会出错。所以我们在玩官方发布包的时候,往往需要通过lipo命令或者编写脚本来手动移除这些无效的架构。(除非你的开发项目只是真机调试,不打算在模拟器上运行,而且添加的动态库刚好不包含i386和x86_64)。

对于Carthage集成的第三方库,在Cartfile文件中添加依赖项后,再执行carthage update命令,会帮助我们生成“动态框架”,如AFNetworking.framework、SDWebImage.framework等。,然后将它们拖动到常规->;链接的框架和库,然后配置相关的复制脚本和命令。详情请参考迦太基快速入门教程。

这里的一个关键操作是在Xcode项目的构建阶段添加一个新的运行脚本阶段,并在脚本中执行以下命令:

如图2所示:

这个命令的作用大概就是帮助我们在打包复制动态库的时候自动删除i386和x86_64。

类似地,当通过CocoaPods集成动态库时,将自动添加一个Shell脚本,以便我们在项目中完成这项工作,如图3中的[CP] Embedded Pods框架所示。

可以自己查看Pods-xxx-frameworks.sh脚本的内容,里面有一个函数strip_invalid_archs(),用来在打包时去掉无用的处理器架构,如图4所示:

所以我们可以通过CocoaPods将自己开发的或者别人提供的动态框架集成到项目中:创建Pods的私有git库(相信大家已经很熟悉了),添加相关的动态。框架文件到git库,然后其Podspec文件的编写方法大致如图5所示。最后,您可以在项目中安装Pod。

最后,我们来思考一个问题:在使用上“静态框架”和“动态框架”似乎没有什么区别,在项目中加入“动态框架”比较复杂,那么在iOS/macOS的开发中,什么情况下会用到动态库呢?