最近在接一个SDK开发的需求,计划打包成静态framework,制作静态framewok的博客网上一搜一大堆,但是真正能说清楚如何依赖AFNetworking的却很少,接下来我们就一起来看一下,如何制作一个依赖AFNetworking的静态库。
第一步,我们要创建一个静态库工程:打开Xcode ->File ->New->Project,会弹出图(1) 效果,我们选择Cocoa Touch Framework
我们新建工程CLNetStaticFramework,那么问题来了,这个静态库如何依赖AFNetworking呢?
方法一:直接将AFNetworking 的源码导入到 CLNetStaticFramework 工程中,不过需要修改类名,不然,引用 CLNetStaticFramework 的工程中可能会造成类冲突。 这种方法不是很优雅,不推荐。
方法二:使用pod 来依赖AFNetworking,打出来的静态库,在引用的时候,引用静态库的工程也需要用pod 安装AFNetworking。这种方法虽然优雅,但是也有风险,比如说一些特别老的工程可能没有使用pod 来管理三方库,这就略微蛋疼了。But。。试问现在还要多少公司的工程不用pod来管理呢?如果采用 “方法一” 仅仅修改类名一项 也是够蛋疼的,而且库升级的话,也是无法自动支持的。说白了,要想没毛病,直接在系统网络的请求API的基础上去做静态库内部的网络请求接口,应该是最没毛病的。
不过,放着这么好的AFNetworking 不用,岂不是暴殄天物么。所以还是要研究一下,framework如何依赖AFNetworking。 好了废话不说了,接下来我们就开始探讨静态库如何依赖AFNetworking。也就是我们下面的第二步。
第二步:
我们cd 到 CLNetStaticFramework 目录下 vim 一个podfile 输入如图(3) :
然后保存退出(esc+shift+: wq)。执行:pod install,关闭掉原来打开的工程,在当前目录下 执行:open . 重新打开工程选择图(4)的workspace
然后新建一个引用AFNetworking 的的类 CLNetAPI。写一个测试代码如图(5)所示
接下来把CLNetAPI的头文件CLNetAPI.h暴露出来如图(6)
把将要暴露的头文件拖动到Public里面,然后把 CLNetAPI.h 引入到CLNetStaticFramwork.h中如图(7)
然后我们要把framework工程修改为静态库framework,因为我们创建的工程默认是动态库工程,如图(8),将红框里面的Mach-o Type 修改为Static Library,这个一定要改,不改的话,打出来的framework 在引用的时候会报 image not found 错误。
接下来就可以打包了,我们这里只打包支持真机的framework
选中device 执行cmd+b build 一下,这时候你会看到工程中product文件夹里面的CLNetStaticFramework.framework 由此前的红色变成了黑色。此时我们构建的framework 已经ok 了。
第三步,也是比较重要的一步,如何使用刚才打好的framework。
新建一个测试工程ABSDKDemo,该工程同framework工程一样,用pod来管理依赖,在podfile里面添加AFNetworking的依赖。将打包好的framework导入到测试工程中,并在viewcontroller里面引用CLNetAPI.h,配置好以后看起来是这个样子的:
此时我们运行工程,并点击屏幕,查看Xcode 控制台打印的日志看是否调用了我们打包再framework里面的网络请求。
结果如上图,和我们预期的一样,果然成功的调用了framework里面封进去的网络请求,到这里,如何打包一个依赖AFNetworking的静态framework 已经聊完了。欢迎大家勘误。