在我们开发的过程中,有时候需要将我们的项目或者功能接入到其他的项目中,这时候我们有很多方式,多工程、静态库、cocoapod远程库、cocoapod本地库等。今天我来讲讲.a后缀的静态库。
准备工作
1.命名一定要规范,我们制作的.a库里所有的.h、.m文件都必须要加上前缀,例如我们的项目前缀就是CK,这样的好处是,减少与目标项目文件冲突的可能性。
2.你需要生成静态库的文件必须要归类到一个总目录下,方便生成库的时候使用方便。
3.准备好入口类(项目所有的外部需要调用的功能应该都能通过该类来实现接口调用,而不是暴露很多个头文件),通常在组件化开发中,我们叫它中间件。
创建lib工程
如果你已经做好了以上两点,那么我们就可以开始创建lib工程了。
1.选择cocoa touch static library
2,命名为testLib
3.创建一个Myfoundation类来表示我们的工程文件,需要通过Myfoundation类来实现工程中的某个功能(吃食物)
4.但是由于项目可能存在多处被外界调用,我们肯定不能一一暴露头文件,那样使用者也会感觉极度复杂,创建一个中间件来间接调用该功能,做好数据异常处理(功能的稳定性不应该交给调用者)
如果我们的静态库项目依赖第三方库该怎么办呢?这个时候就要用到终端了
1.cd到目标目录
cd /Users/pqh/Desktop/TestLib
2.生成pod环境
pod init
3.编辑podfile
open Podfile
4.添加自己的依赖库,为了避免文件与主工程冲突,我们需要加一段代码,如下所示,因为打包静态库的时候,pod导入的三方库会加前缀PodsDummy,那么目标工程在导入相同的库会文件冲突,所以我们要手动改变PodsDummy为自己的前缀
TestLibDummy
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = '$(inherited), PodsDummy_Pods=TestibDummy_Pods'
end
end
end
5.安装pod库
pod install
5.项目中如果有MRC报错,则需要在compile sources中对应MRC文件添加-fno-objc-arc
6.暴露头文件:MyHeaderFiles.h
修改配置
1.testLib->Edit scheme->info->Build Configuration->Release
2.静态库兼容最低版本
3.Build Active Architecture Only 我们设置为Yes
设置为NO的时候,会编译支持的所有的版本,
设置为YES的时候,是为Debug的时候速度更快,它只编译当前的architecture 版本
Valid Archetectures设置如图所示
4.一些其他配置(看个人喜好配置)
Dead Code Stripping > NO(去掉不会执行到的代码)
Strip Style > Debugging Symbols
Strip Debug Symbol During Copy > NO(去掉Debug相关符号)
Strip Linked Product > NO
5.至此我们项目基本配置已经ok了,我们可以尝试编译,应该是没什么问题的,如果有问题,可以根据报错提示去Google一下。
打包静态库
1.选择任意模拟器编译生成模拟器的包
2.选择Generic iOS Device 编译生成release包
3.在products目录下,libTestlib.a open in finder我们会看到两个目录
os下是真机包(上线用),simulator下是模拟器的包
4.但是通常我们会合并这两个包来减少不必要的操作,打包上线时,会自动帮我们选择对应的文件,不会增大上线包的体积。
5.如何合并两个包来测试呢?我们先创建一个目录用来管理需要给别人使用的文件,创建一个文件夹,并cd到该目录
cd /Users/pqh/Desktop/TestLibResouce
6.合并
lipo -create
/Users/pqh/Library/Developer/Xcode/DerivedData/TestLib-bepyitzeumbotygtmzjjjarfnaqy/Build/Products/Release-iphonesimulator/libTestLib.a
/Users/pqh/Library/Developer/Xcode/DerivedData/TestLib-bepyitzeumbotygtmzjjjarfnaqy/Build/Products/Release-iphoneos/libTestLib.a
-output TestLib.a
7.在include目录下,取出暴露的头文件,放到我们的TestLibResouce
8.将TestLibResouce放入到目标工程测试,需要注意的是,在目标工程也要通过cocoapods添加.a依赖的第三方库。
9.导入HeaderFile中间层,尝试调用我们的功能。