iOS项目framework拆分问题记录
1. Framework和Library
Xcode项目除了编译App应用程序,还可以编译Framework和Library,这是包含可重用代码的项目,可以被其他应用程序或项目引用。在iOS平台下,Framework和Library都是用来封装和分发代码的方式,但在功能和结构上有一些区别。
Library(静态库和动态库):
- 静态库(.a):在编译时,静态库会被完全复制到执行文件(如应用程序)中,增加了执行文件的大小。静态库与执行文件是一体的,不需要单独分发。
- 动态库(.dylib):在运行时被动态链接,可以被多个执行文件共享,节省了存储空间。但是,动态库需要与执行文件一起分发,且需要注意版本兼容性问题。
Framework:
- Framework是MacOS和iOS特有的,是一种封装库、头文件和资源(如图片、本地化字符串、Storyboard等)的方式。
- Framework可以是静态的或动态的。动态Framework(.framework)可以被多个应用程序共享,但每个应用程序的静态Framework都有自己的副本。
- Framework的结构使得头文件、库和资源的管理更加方便,也更适合分发。
总的来说,如果你的代码需要包含资源,或者你想更方便地管理和分发你的代码,Framework可能是更好的选择。因为打包成Lib又需要引用资源,需要把资源放在外部目录,破坏了组件化管理原则。只有一些代码,不需要包含资源,也不需要复杂的版本管理,那么静态库或动态库可能更适合用来项目组件化。
2. Framework和Library被引用的方式
大的方案来说,有直接添加到项目中或者使用CocoaPods。细节上来说,一个库需要正确的引用到,涉及到以下的方式。引用头文件的方式,通过预编译头(PCH)文件、模块(Module)等方式来引用。这些引用方式的具体配置如下:
预编译头(PCH)文件:你可以在PCH文件中引入Framework或Library的头文件,这样在整个工程中都可以使用这些头文件,无需再单独引入。在Xcode中,你需要在”Build Settings”下的”Prefix Header”选项中指定你的PCH文件路径。
模块(Module):如果你的Framework支持模块,你可以直接使用
@import
语句来引入整个模块,无需单独引入各个头文件。在Xcode中,你需要在”Build Settings”下的”Enable Modules (C and Objective-C)”选项中启用模块。直接引用:在你的源代码文件中,你可以直接使用#import或#include语句来引入Framework或Library的头文件。
如果是使用cocoapods可以观察pod成功之后Pods-XX里面的Pods-xxx.release.xcconfig文件,这个文件和手动面板配置等价,例如”Build Settings”下的”Search Paths”、”Build Settings”下的”Linking”、”Build Phases”下的”Link Binary With Libraries”,最终都是编译命令的编译参数。
3.WorkSpace
4. Module
Swift****文件引入不允许引入一个不属于任何模块的头文件,所以import的oc库必须模块化
4. Pod库遇到的问题、Podfile注意事项
依赖的第三方如果是objc库,有头文件,就检索不到设置一下headersearchpath
s.xcconfig = { ‘USER_HEADER_SEARCH_PATHS’ => ‘“${PODS_ROOT}/Headers/Public/ZLPhotoBrowser” “${PODS_ROOT}/Headers/Public/SQLite.swift”‘ },或者设置HEADER_SEARCH_PATHS,但是HEADER_SEARCH_PATHS已经被pod自动设置过了,所以最好别用,可以在Pods-LiHua.debug.xcconfig里面看。