开发中会有一些常用的类或方法,或者是某个特定功能的,比如一个自定义的弹框、一个更容易使用的网络请求库,可以把它们放到一个单独的工程里,通过静态库(library、FrameWork)的方式应用到任何其他需要的项目里。就像使用百度地图sdk那样。
现在有一些文章介绍如何构建和使用自定义的静态库,但似乎没有说使用Workspace的。其实本质上,Workspace还是编译静态库然后给主工程使用,但不用先打开工程A,编译出libA.a,然后把文件拖到工程B,然后再工程B里面使用。主工程和它所用到的库工程是在同一个工作环境下(估计这就是Workspace的名字意思吧)。配置好了之后,你只需要运行主工程的target,会自动帮你编译需要的库。用过Pods库应该就明白。
总结了一下使用WorkSpace的好处:
1.只需要打开一个工作环境,需要修改、同步代码,都不需要打开新的项目、新的文件,让人可以集中心思在代码上,在不同的项目里跳来跳去很容易打断思维的。
2.可以像同一个工程里一样,直接点击方法名查看引用库项目的代码,否则就要打开另一个项目,然后找到对应文件再找到方法。
3.只要运行自己的项目就行,就会自动帮你编译库文件。
下面就以一个小例子来说一下workspace的操作。
1.新建项目MyWorkSpaceDemo为主工程。
2.新建.a库工程
3.新建workspace工程,将上面两个工程加入
目录如下:
4.在PersonManager工程中的targets中选择PersonManager的在Build Phases中新建Copy Files将libPersonManager.a导入,修改Desination为Absolute Path相对路径,Path改为$(SRCROOT)。会在当前目录生成libPersonManager.a文件。在另一个Copy Files中,导入头文件,修改路径为相对路径$(SRCROOT)/Headers,这样会在当前目录下生成Headers文件夹,将需要外面使用的头文件拷贝到该文件夹下。在Build Settings中修改Deployment下的iOS Deployment Target为iOS某个版本。
5.在PersonManager的targets下新建一个target->OS X(Framework&LIbiary)->Bundle为一个资源包。在Build Phases中Copy FIles使用相对路径,目录为$(SRCROOT),添加PersonRes资源包,这样会在编译后在当前目录下生成一个bundle资源文件。在Copy Bundle Resources中加入图片等资源。在Build Settings中修改Architectures下的Base SDK为iOS下的,因为bundle只有os下才有。
如果有版本要求,在Build Settings中修改Deployment下的iOS Deployment Target为iOS最低的版本。
6.在主工程MyWorkSpaceDemo的在Build Phases中Link Binary With Libraries中导入上面.a静态库和bundle资源包。在Build Settings的Header Search Paths中加入$(SRCROOT)/PersonManager/Headers属性为recursive自循环查找。$(SRCROOT)/为当前目录;$(SRCROOT)/../为当前目录的上级目录。
7.在主工程需要使用第三方的地方,导入头文件。然后使用即可。
这样就可以对封装的类库进行断点调试,也方便统一管理。