今天同事在与外包公司引入他们静态库到我们已有工程时,提到两边重复引用的静态库问题,提出了这样一个想法。
我们在开发中现在普遍运用Pod引入第三方开源库,当我们自己开发时比较方便,并且不用看文档对工程进行设置。当我们需要将自己开发的完整工程或者部分模块对接到别人的工程中,又不希望暴露自己的源码的时候,就要考虑到运用的库的问题了。
解决这个问题的方法有不少
第一,将自己工程中的类重命名,添加特色前缀
第二,让引用你的人自己改
第三,将开源库玻璃,创建文档,自行添加
第四,协同使用Pod管理,使用同一套库
前两种不需多说,如果工程量小,还可以考虑,一旦多用几个库,头都大了。第三种和第四种的区别只是在Pod可以帮助我们管理那些库,省去了不少的麻烦。这里我就简单的演示下第四种,和大家一起学习交流,希望大家多提意见和想法,一起提高。
项目结构,源码地址
操作步骤很简单,对我旧工程中使用的开源库使用Pod管理
生成的文件内容
使用workspace打开工程后,新建一个需要植入的Library静态库工程
这里我的命名是OtherLibrary
本文demo是调用开源库MBProgressHUD,在demo中调用
#import <MBProgressHUD/MBProgressHUD.h>
- (void)podBtnAction:(UIButton*)sender {
[MBProgressHUD showHUDAddedTo:self.view animated:YES];
[self performSelector:@selector(hide)withObject:nil afterDelay:3.0];
}
- (void)hide {
[MBProgressHUD hideHUDForView:self.view animated:YES];
}
这里都是很简单的调用事例。
在OtherLibrary内容中也需要引用处理MBProgressHUD
该怎么办呢,我们需要在静态库中直接调用Pod中的库。就需要引入文件
#import"OtherLibrary.h"
#import"MBProgressHUD.h"
@implementationOtherLibrary
+ (void)showHUD:(UIView*)tView {
[MBProgressHUD showHUDAddedTo:tView animated:YES];
[OtherLibrary performSelector:@selector(hide1:) withObject:tView afterDelay:1.0];
}
+ (void)hide1:(UIView*)tView {
[MBProgressHUD hideHUDForView:tView animated:YES];
}
@end
当我们这么做,一切看起来都是再正常不过了的,但是build一下就会发现error了,会提示MBProgressHUD.h Not Found!这时候我们需要设置文件的引用路径了。
我们可以�观察使用Pod管理库之后,基础工程中设置的库文件引用路径,然后再根据上面我们在文件夹里看到的文件层次结构图,来设置静态库中引用文件的路径。
这样就能正确引用文件了
#import"MBProgressHUD.h"
到目前为止我们实现了自己想要的结构设计,
1、被植入工程(OtherLibrary)
2、基础工程(UleIonicDemo)
3、Pod工程
接下里就是打包代码了,我们需要在debug开发到一定阶段后将静态库交付到基础工程中。
#import <OtherLibrary/OtherLibrary.h>
- (void)otherBtnAction:(UIButton*)sender {
[OtherLibrary showHUD:self.view];
}
需要注意的是,移动到其他的地方,比如说发送给其他人打包的时候。我们在将OtherLibrary打包的时候只有OtherLibrary中的自己编写的代码,当我们尝试编译的时候会发现MBProgressHUD.h Not Found!
因为我们的工程中没有这些东西,这里我就有一步是无法避免的了,需要copy开源库中的所有import的.h文件到工程里面。
这样就能编译出一个正常的可使用的静态库文件了。
打包注意事项
1、如果文件夹单独移动拿出来,可以不需要引入.h打包,因为在Xcode的设置中是有文件路径设置的,还在同一基础目录下
2、如果是单独发送给其他人打包,还是需要引入.h
在我debug开发的时候设置的是1s。
将工程文件删除,使用打包静态库形式设置的5s,
未清除Derived Data,log
清除Derived Data,log
可以发现,没有清除的时候是有缓存的。
当我们在处理的时候还有一个问题,如果是先debug开发好了,在最终环节引入打包好的静态库时,要注意查看你的引入的库是你新编译的还是Xcode缓存的旧的,我这里使用Xcode->Window->Project清除Derived Data。