iOS SDK 开发 -- Framework
刚接触 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 的文章来写。