1.工程依赖另一工程
1.首先我们创建两个工程DemoA和DemoB(打开xcode,command + shift + n,两个ios app)
2.cd 到DemoA中,创建一个Framework的文件夹,并把DemoB拖进Framework文件夹中,如下图所示
3.此时打开DemoA工程,你的DemoA工程里是没有DemoB项目的,你可以通过 3.1 直接将DemoA中的Framework文件夹拖进xcode工程中,这样操作的话接下来的编译过程会报 错,解决办法是将下图中的与DemoB相关的文件剔除掉,你只需要留下DemoA的。
3.2 你可在xcode中按下图所示操作,这样不会出现3.1中出现的问题
4.假设你在DemoB中有一个Person类,此时你需要在DemoA中使用Person类,那么你可以通过在DemoB中创建一个framework,将person类关联到framework,通过framework你就可以在DemoA中使用Person类了,按下图步骤操作
4.1这里你要是不勾中DemoBFramework的target,下面4.3你就看不到person的.h文件了
4.2关联target
4.3把person的.h文件放在public中
4.4在DemoA的link binary with Libraries中添加framework,在dependencies中也加入这个framework是可以在编译DemoA的时候也顺便编译这个framework,你也可以不加
4.5在framework的头文件中以下图方式导入这个Person类,不然会有一个警告,你可以自己试试看
5.此时你已经可以在DemoA中使用Person类了
2.工程依赖framework
这个就不需要说了,和上面的操作是一致的
3.工程依赖Static Library
依赖Static Library的过程其实和framework的差不多,但是在依赖的过程当中,细节上的确是有点复杂,其实当你知道这个依赖过程之后,你应该也知道了制作.a的过程了。 下面我们的需求是在DemoA中依赖一个Static Library。
1.我们直接在上面项目的基础上添加一个Static Library
2.接着我们创建一个Human类,写一个walk的实例方法。
3.在Static Library中导入Human.h
4.下图这里你需要public什么头文件,你就把头文件加进去,我这里public了StaticLibrary.h和Human.h。
5.我们现在来到DemoA的target里,一样 Link Binary With Libraries,Dependencies可添加可不添加,添加之后,编译DemoA的时候也会顺便编译Static Library。
6.这样你就可以调用了
我们很简单的介绍了一下这个过程, 但是假如你想打一个.a的包,这该如何操作呢?我们以xcode12来讲解。
7.找到Static Library的target,将build setting中的Build Active architecture Only的debug改成NO,这个值原本应该是YES,这样一来,当你在debug模式下选中某个机型的模拟器按command + B编译的时候,就不仅仅只是编译出这个机型的架构,而是和release一样,将所有支持的架构都编译出来了。
8.选中当前Static Library的scheme,我们就用iphone 12 Pro Max的模拟器来编译了。
9.此时你可以通过下图的方式找到.a所在的文件夹
10.cd 到这个文件里,执行lipo -info StaticLibrary.a 你可以发现我们打包的这个.a的静态库支持arm64 x86_64 i386架构。
11.如何在模拟器中编译出来的.a库不支持arm64架构?请按下图操作,在Excluded Architecture中假如的架构将不会被支持,就是说假如我们按照下图在debug和release下都将Any ios Simulator SDK的值设置为arm64,那么在模拟器当中编译的时候不管是debug还是release环境下,我们编译出来.a文件都将不支持arm64架构,仅仅是在模拟器当中编译的时候。
12.然后我们再编译一下真机环境,真机环境scheme选Any iOS Device。这里又有一个地方要注意了,如果你在不修改所支持的最低版本的情况下,你编译出来的.a库只会支持arm64,请按照下图操作更改最低支持的版本,那么你就可以支持armv7了。
13.现在我们已经编译出了模拟器和真机两个版本的.a文件了,通过上面介绍的show in finder找到.a文件夹所在路径。接下来应该是最后一个步骤了,合并.a文件,将只支持模拟器版本的.a和只支持真机环境的.a合并,那么合并后的.a即可以支持真机也能支持模拟器了。
14.先确定模拟器环境下编译的.a是不是只支持x86_64和i386,你可以通过lipo -info libStaticLibrary.a来查看。
15.接着我们来看真机环境的,我这边支持的是arm64,armv7。
16.lipo -create (这里填上StaticLibrary的路径)/模拟器版本的.a (这里填上StaticLibrary的路径)/真机版本的.a -output (这里填上你要输出的路径)/输出的名称.a
17.记得把include文件夹(你可以直接赋值模拟器环境或真机环境下里的include,在步骤13里你可以看到)也要保存下来,这样就完成了
大功告成了,如果你在制作过程中遇到零星的问题,自己搜索下,毕竟亲身参与过不容易忘记。