iOS 将包含cocoaPods的整个工程打包成.framewo
最近在研究将集成有cocoaPods的工程打包成.framework和.a文件的问题。网上搜了很多,基本上大多数都是没有包含cocoaPods的,没有什么用。现在iOS开发基本都是基于cocoaPods来管理我们的第三方类库,那么我们回到今天的话题,如何实现?(此日记是2018年写的,之前一直没有发布,所以截图都是比较老的,如果遇到问题可以私信或者评论我,我看到就会回复的)
一、打包.framework
1.新建工程选择如图:
2.然后配置工程信息:
选择配置的版本 bit修改为NO 对比这些参数(用于打包后面详细说) 此处修改为静态库类型基本的配置就是这样,然后就开始集成你的cocoaPods这个就不用多说了吧?
3.集成完了之后就需要把我们自己用到的类导入到静态库工程里面如图:
4.之后就开始最重要的部分了,分配编译和要暴露的文件。如图:
我的工程中我把名字为TestKang的类作为被暴露的文件(把自己的需求封装成方法在此文件中),需要注意的是 在需要编译的.m文件中 千万不能把appdelegate 文件参与编译,否则会造成冲突。
这样就完成了然后可以选择模拟器或者真机编译打包。编译以后你可以找到你打包好的静态库了如图
然后把这个.framework文件拖到你要用的工程中就可以了。要注意:如果你要运行的工程没有cocoaPods那么此时你的静态库中如果用到了第三方类库的代码,那么程序会闪退。解决办法:你的工程也要集成cocoaPods记住里面也要集成你静态库里面用的第三方哦。如果集成了还是闪退,解决办法如图:
添加这个$(inherited)或者叫做继承二、打包.a
1.新建.a静态库工程如图:
2.同framework第二步一样,把工程的基础配置配置好,比如bit等。
3.同样把需要用到的类导入到工程里面如图:
4.然后我们开始用cocoaPods集成第三方类库我这里事先已经弄好了。
5.重点来了,我们需要新建一个header来暴露出我们的一个头文件跟framework的原理是一样的。如图:
新建header然后我们把我们要暴露的头文件移动到public中,此处我暴露的是testA头文件如图:
布置好头文件6.此时我们已经集成完了,需要的就是编译了,跟framework一样。然后把这个.a文件和你要暴露的.h文件一起拖到你要用的工程中就可以了。要注意:如果你要运行的工程没有cocoaPods那么此时你的静态库中如果用到了第三方类库的代码,那么程序会闪退。解决办法:你的工程也要集成cocoaPods记住里面也要集成你静态库里面用的第三方哦。如果集成了还是闪退,解决办法还是跟framework一样。
三、打包bundle资源文件
1.新建budle工程如图:
2.配置工程信息如图:
修改成iOS系统 修改为NO 修改为NO3.工程配置完了之后就是拉图片或者xib等资源文件,这里我只证明了图片,xib等其他资源没有做,原理应该是一样的。将图片拖入到工程里面如图:
4.此时就完成了,开始编译。然后将bundle文件复制到要运行的工程里面。
注意事项:因为bundle文件是另外建立的,那么我们在静态库中用到图片的时候图片的命名要根据你bundle里面图片的路径去命名,比如我的工程:
路径一定要对补充图片路径设置:
设置文件路径
NSString *bundlePath = [[NSBundlemainBundle]pathForResource:@"SourcesBundle"ofType:@"bundle"];
NSBundle *resourceBundle = [NSBundlebundleWithPath:bundlePath];
加载 nib文件
UINib *nib = [UINibnibWithNibName:@"Demo"bundle:resourceBundle];
NSArray *viewObjs = [nibinstantiateWithOwner:niloptions:nil];
获取 xib文件
UIView *view = viewObjs.lastObject;
view.frame = CGRectMake(20,50,self.view.bounds.size.width -40,self.view.bounds.size.width -40);
[self.view addSubview:view];
VC获得bundle中的资源
NSString* bundlePath = [[NSBundlemainBundle]pathForResource: @"MyBundle"ofType:@"bundle"];
NSBundle*resourceBundle = [NSBundlebundleWithPath:bundlePath];
UIViewController*vc = [[UIViewControlleralloc]initWithNibName:@"vc_name"bundle:resourceBundle];
图片获得bundle中的资源
UIImageView*imgView=[[UIImageViewalloc]initWithFrame:CGRectMake(50,50,50,50)];
UIImage*image = [UIImage imageNamed:@"MyBundle.bundle/img_collect_success"];
[imgViewsetImage:image];
补充总结:首先说一下编译的注意事项:
1.不管是.framework还是.a文件,你编译的时候都可以真机和模拟器,分别是在两个不同的文件夹下面如图:
上面是真机 下面是模拟器不管是真机还是模拟器我们最终的目的是要让他们合并成一个。合并方法:
在终端输入以下命令行:lipo -create (空格)模拟器.a文件的路径(空格)真机.a文件的路径(空格)-output 合并后的保存路径(这个路径自己定义)这样就得到最终的静态库文件了。