前提: 在开发项目中,我们经常会用到一些第三方的sdk,不管是以.a或是.framework的形式,当然我们也可能去做一些这种sdk供其他人来使用,我们是用到了framework的形式,简单的说下
Step 1 新建一个framework工程,一般封装成SDK的话,后期维护是不可避免的,所以工程名字建议起的好一点
Step 2 编译
我以MJExtension为例,将MJExtension拖入后在模拟器/真机的环境下编译(运行)一下,首先看到如下图,名字字体变黑,说明你的项目没有问题,可以进入下一步。
Step 3 配置
1、系统会自动生成一个.h文件,(我的就是Test.h,可以找到),用来放置一些公开的头文件,删除会报错,暂时留着吧,不想用不要公开就好了
2、工程文件的配置,如图:
3、公开头文件,把你想要暴露给使用者的头文件统统暴露出来,从左面拖也好,从下面拽上来也好,都可。结果如下图:
4、pch文件的配置,plist文件的配置,按照你项目配即可
Step 4 打包、合并
1、打包
在真机和模拟器的环境下分别编译,注意,应该是Release版本,因为毕竟是要给其他使用着。
都运行好之后,在你的项目中framework处Show in Finder,找到你的framework,如下图,先不要关掉,开始合并
2、合并
1、检查架构支持情况,以模拟器编译的framwork为例
打开终端 输入
lipo -info xxxxx
查看支持的架构,xxxxxx下面这个东东的文件路径,如图,拖进去
回车,结果如下图:
2、合并
lipo -create xxxxxx zzzzzzz -output xxxxxx
xxxxxx 指真机路径(output后面的也是) zzzzz 指的是模拟器路径 ,拖入的都是上面那个
回车
合并好后,再把合成后的framework(在真机路径下) 使用命令lipo -info xxxxx 重新检查一遍架构,这个时候应该是支持 armv7 i386 x86_64 arm64 的
至此,打包的工作已经完成!祝贺!!!
bundle文件的生成
1、Xcode创建
2、直接创建一个文件夹,把后缀名改为.bundle,点击添加即可
读取图片或文件的方法就要换掉了,以图片为例:
1、使用于文件类型
NSString *bundle = [[NSBundle mainBundle] pathForResource:@"Resources" ofType:@"bundle"];
NSString *strC = [[NSBundle bundleWithPath:bundle] pathForResource:imgName ofType:@"png"];
strC = [[NSBundle bundleWithPath:bundle] pathForResource:[imgName stringByAppendingString:@"@2x"];
UIImage *img = [UIImage imageWithContentsOfFile:strC];
2、适用于图片
[UIImage imageNamed:imgName inBundle:[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"Resources" ofType:@"bundle"]] compatibleWithTraitCollection:nil]
解决第三方库文件冲突的问题
在我们打包sdk的时候,可能会用到一些第三方,如SDWebImage、AFN这些东西,如果项目中没有添加_all_load字段,那么恭喜你,不用改,但如果有或者报类名重复的错误,那么你就要改名字了
解决方法:
1、删除_all_load字段,不推荐,因为会使静态库中的Category中的方法失效
2、利用终端删除framework中的冲突文件(需要各位自己去网上找,因为第三方被我们修改了很多,所以没有采用这种方法)
3、在fromework源项目中建立PCH文件,把类名改掉,就像
#define MJProperty XXXMJProperty
#define MJFoundation XXXXRLVMJFoundation
很多,要改好多,你最好在项目中添加一个Target,用来做Demo,以便进行!
后续修改、更新......