一、主要讲解.framework静态库制作(包含build文件).由于.a静态库制作比较简单,这篇就不介绍了.
二、简单制作.framework静态库(不包含build文件)。
公司需求:写一个类似于微信授权登录功能的sdk静态库工程,提供给第三方app调用.
分析:1.需要用到url_scheme,以便实现app之间的跳转(下篇详细介绍).
2.sdk静态库里需要封装网络请求工具类,即静态库里封装静态库包.
3.需求需要sdk中封装界面,搭建ui,加载图片等,所以需要build资源文件,制作.framework静态库.
4.如果是只封装方法,暴露头文件给第三方app使用,制作简单的.a静态库即可.
实现方式: 制作.framework静态库.
假设 (环保执法) 是第三方app,我们自己的app叫做vPort.
点击vPort身份按钮,使用sdk跳转vPort,使用vPort进行登录.
需要达到的效果是这样的:
IMG_0439 2.PNG
需要sdk跳转应用vport,调起vport的第三方登录界面.
IMG_0440.PNG
一、制作.framework的详细步骤:(包含build文件)
1.搭建bundle工程,打包资源文件.
屏幕快照 2017-03-29 上午10.25.46.png
屏幕快照 2017-03-29 上午10.27.16.png
2.工程设置:
2.1. 工程里面只有两个文件,Info.plist和BuildSFVportApp.bundle文件,接下来我们将进行一些设置,选中项目文件,然后点击TARGETS->Build Setting,直接搜Architectures,然后将Base SDK改为Latest iOS.
屏幕快照 2017-03-29 上午10.42.22.png
2.2. 接着设置,搜索Mach -O Type
屏幕快照 2017-03-29 上午10.44.50.png
2.3. 接着设置,搜索linking
屏幕快照 2017-03-29 上午10.48.40.png
2.4.接着上一步继续设置.
屏幕快照 2017-03-29 上午10.51.26.png
2.5. 接着设置,搜索packaging
设置完,你会发现注意,Products下文件名就变成BuildSFVportApp.framework了,继续我们的设置.
屏幕快照 2017-03-29 上午10.55.56.png
2.6. 接着设置,搜索linking
屏幕快照 2017-03-29 上午10.59.58.png
2.7. 接着设置,搜索 skip install
屏幕快照 2017-03-29 上午11.04.16.png
2.8. 设置infoPlist文件
屏幕快照 2017-03-29 上午11.06.50.png
2.9.选中Build Phases,在下方空白处点一下,然后editor -> add build path -> add header build path,如图:
屏幕快照 2017-03-29 上午11.11.11.png
2.10.紧接着在Link Binary With Libraries将UIKit引入
屏幕快照 2017-03-29 上午11.24.37.png
2.11. 经过这一步之后Build path下多处了一项,名为Headers,目前里面有0个项目,点击左边的三角形会发现里面有三项,Public, Private, Project.
需要对外暴露的头文件就放在Public下,其他的就放到Project下,待会儿就会看到怎么去用。在这里我们是为了存放源程序库,里面是二机制代码,不能够存放诸如xib,图片,等资源文件。
所以我们还要另外创建一个包去存放我们的图片,选中TARGETS下BuildSFVportApp,点击Editor -> Add Target选择bundle.
将bundle命名为BuildSFVportResource
屏幕快照 2017-03-29 上午11.37.02.png
2.12. 创建好后整个工程看上去应该是这样的:
选择BuildSFVportResource,进行设置.
选中刚刚创建的那个Target,点击Build Phase,点击右边的删除图标,将Compile Sources, Link Binary With Libraries删除掉.
删除的原因是如果不删除,上传到App Store时苹果会报错,说你的包里面无源文件.
屏幕快照 2017-03-29 上午11.38.39.png
2.13.删除完成后是这样的:
屏幕快照 2017-03-29 上午11.43.42.png
2.14. 有时,就算你在这里进行了删除,苹果还会报另外一个错,为了保险起见选中BuildSFVportResource 下的 Info.plist文件里面的CFBundleExecutable这个key,进行删除.
删除这两行:
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
![屏幕快照 2017-03-29 上午11.49.36.png](http://upload-images.jianshu.io/upload_images/1619319-985f60f688df62ab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2.15. 继续选中BuildSFVportResource这个TARGET,点击Build Settings, 搜索COMBINE_,将其值设为NO.
屏幕快照 2017-03-29 上午11.55.06.png
2.16. 接着设置,搜索Base Sdk,设置成latest iOS.
屏幕快照 2017-03-29 上午11.56.33.png
2.17. 由于当我们给客户提供包时资源库的名字一般和SDK的名字是一样的,所以最后搜索product name,将其改为BuildSFVportApp.这个名字跟你写的sdk名字一致即可.
2.18. 基本设置完毕,由于sdk中需要用到图片,先将图片拖入到BuildSFVportResource目录下.
屏幕快照 2017-03-30 上午11.26.52.png
2.19. 现在就可以建立项目了,新建一个类,继承NSObject,在里面去写实现.
选中BuildSFVportApp文件夹,添加一个cocoa的class,让他继承于NSObject,将其命名为WFVportAllowLogin,简单写两个方法在头文件中对外暴露接口.
屏幕快照 2017-03-30 下午2.25.03.png
2.20. 添加方法,加载图片,静态库中使用图片跟普通工程加载图片有所不同,需要引入NSBundle进行加载.
使用控制器+xib封装到sdk也是一样,注意NSBundle的使用,这时不能传nil了.
屏幕快照 2017-03-30 下午2.37.44.png
2.21. 由于这个+(NSString *)url类方法是让其他app去调用的,所以,选中BuildSFVportApp在Build phase下将WFVportAllowLogin从Project下拖到Public下.
屏幕快照 2017-03-30 下午2.46.10.png
2.22. 最后的设置.
屏幕快照 2017-03-30 下午2.48.41.png
2.23. 至此,就完成了所有的工作.把两个target都编译一下.
product下的文件就变成了灰色,就是可以运行了.
屏幕快照 2017-03-30 下午2.55.57.png
2.24. 生成模拟器和真机都可以运行的sdk环境.
选中Product下的文件,右键 Show in Finder查看。
由于规范需要,我将sdk工程名BuildSFVportApp改名为了BuildSFVportSdk.
所以下面大家看到的sdk静态库包名为BuildSFVportSdk.framework了.
生成模拟器和真机均可运行的sdk,本质就是改变二进制文件的编译.
打开终端,cd到Products目录下,执行命令:
lipo -create 真机二进制文件的路径(二进制文件在.framework包中) 模拟器二进制文件的路径 -output BuildSFVportSdk(最终生成通用二进制文件的名称).
屏幕快照 2017-04-11 下午4.13.42.png
屏幕快照 2017-04-11 下午4.14.39.png
2.25. 执行完命令后,在Products包下会生成通用的二进制文件BuildSFVportSdk.
执行命令为:lipo -create /Users/tangshuya/Library/Developer/Xcode/DerivedData/BuildWFVportSdk-bdhubopldatlubhgzurjhyczojlr/Build/Products/Debug-iphoneos/BuildWFVportSdk.framework/BuildWFVportSdk
/Users/tangshuya/Library/Developer/Xcode/DerivedData/BuildWFVportSdk-bdhubopldatlubhgzurjhyczojlr/Build/Products/Debug-iphonesimulator/BuildWFVportSdk.framework/BuildWFVportSdk
-output BuildWFVportSdk
屏幕快照 2017-04-11 下午4.31.47.png
屏幕快照 2017-04-11 下午4.32.08.png
3.0. 使用sdk.
BuildWFVportSdk.framework的制作已经完成,接下来就是使用他们了,这里我们新创建一个single view application,取名为PoliceFoShan.
然后将我们刚刚生成的.framework文件以及.bundle文件拖到这个项目中。
屏幕快照 2017-04-11 下午4.38.05.png
3.1. 由于sdk中使用了第三方依赖库,所以需要将依赖库添加到项目中,目前需要添加的依赖库为:AFNetworking和SVProgressHUD.
可以下载安装包添加,也可以通过cocopods集成.
3.2. 在需要使用sdk的地方,导入头文件进行使用就可以了.
#import <BuildWFVportSdk/WFVPortAllowLogin.h>
二、如果是制作简单的.framework静态库,不需要build资源文件,按照以下步骤可以很轻松的实现:
1.创建工程--选择 “Cocoa Touch Framework”
1642454-f6cbf644793c09e3.png
2.设置Mach-O的编译方式,选择工程--Build Settings,搜索mach
这步很重要,这一步决定我们制作出来的是静态库还是动态库,默认选择的是Dynamic Library,要手动选择Static Library。
3.继续搜索--Build Active Architectures--设置为NO。
设置为NO的时候,会编译支持的所有的版本
设置为YES的时候,是为Debug的时候速度更快,它只编译当前的architecture 版本。
4.搜索Architectures--点击+号,添加armv7s,支持真机类型。
5.搜索link with
将Link With Standard Libraries设置为NO.
6.如果导入第三方库,.a静态库(AFNetworking等),不要选择添加target。
这样避免了,别人项目在引入相同的第三库不会报错。
1642454-76744bf837210a25.png