iOS SDK 开发 -- Framework

2017-01-14 10:23:05来源:http://www.jianshu.com/p/f001aa44a043作者:YxxxHao人点击

第七城市

刚接触 iOS SDK 开发的时候,纠结了好久自己打包成的 Framework 到底是动态框架,还是静态框架呢?也随着自己对 SDK 开发的逐步了解,在这里做下简单的总结。


在iOS SDK 开发 -- 入微一星一文中说过,需要将 Framework 工程的 Mach-O Type 设为 Static Library 才能正常编译通过,现在来解释下原因,因为 iOS 出于安全考虑,是不允许调用系统以外的动态框架的,所以需要对外提供第三方框架的时候,需要我们打包成二进制的可执行的表态包。但有使用过 .a 的表态库经验的,都应该知道,在添加 .a 二进制的同时,还需要指定 .h 头文件的路径,比如在 Swift 中使用 MySQL 的时候,就需要把 MySQL 的相关 Lib 添加进来的同时,还需要指定它的头文件路径。这样的库使用是比较烦人的,因为不同的开发环境,就可能需要开发人员去重新配置一次,特别是团队协同开发的时候,这个问题就更加明显了。


而从 xcode 6 开始后,apple 提供新一种方式来处理这个问题,就是提供制作类似于系统自带的 Framework 方法,但需要注意的是,apple 自带的 .framework 为后缀的是动态框架,是集成系统中,而我们生成的 Framework 虽然也是 .framework 为后缀,但它的本质还是静态包,在使用的时候需要手动添加连接进去。


我们来看下自己生成的 Framework 结构:



F7C0800C-98AD-4A63-BF5D-3568DF641511.png

看上面的目录结构,其它 Headers 这个文件夹的作用很明显,就是存放相关的头文件,而下面的 sdkSample 就是该 Framework 对应的静态包了,这个也很好理解,我们需要的是把关注点放到 module.modulemap 里。


首先,先看下 module.modulemap 的内容:


framework module sdkSample {
umbrella header "sdkSample.h"
export *
module * { export * }
}

module.modulemap 文件其它就是对一个框架中的库的所有头文件的结构化描述,这个说法好像有点抽象,简单点来说,就是告诉系统,你的库的结构是怎么样的,头文件放在哪里的意思。比如;


umbrella header "sdkSample.h"

就是告诉系统需要导入头文件有 sdkSample.h,这样我们就不需要再手动去指定头文件的路径了。


我们在导入 Framework 的同时,modulemap 也随之导入,在编译的时候系统会自动去找所有的 modulemap 文件,把相应的头文件导进来。这些都是系统自动去做的,我们不需要去关心,想要深入了解的,可以自行去查下。


关于使用 Swift 来开发 SDK

目前 Swift 3.0 版本是相对稳定,但实际上 Swift 变动也是会比较大,运行时也一直在变动,目测官方也没推荐单独用 Swift 来开发 SDK,但实际上我们还是可以使用 Swift 来开发 SDK 的,但兼容性这些就需要考虑,如果后继版本变动大的话,相对的维护成本也会比较高,这个就根据实际需要来选择了。这里就不单独提供 Swift sdk 的 demo 了, 有兴趣的可以参考下前面用 OC 写 sdk 的文章来写。




第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台