首页 > 代码库 > 一种比较实用的iOS SDK项目架构

一种比较实用的iOS SDK项目架构

在SDK开发中,一般会需要经过几个流程,开发SDK,测试SDK,把SDK交付给使用人员,这些东西看似步骤多,过程繁琐,而且每修改一次SDK就需要重复一次上述的过程,增加了一些不必要的操作。当然,如果我们在SDK设计之初就有一个好的项目架构,就可以极大简化开发流程,提高开发效率,本文将带读者一步一步设计搭建一个个人认为比较好的SDK开发架构。

创建基本的工作空间

工作空间这个概念对于很多人并不陌生,平时使用得很多的CocoaPods里面其实就使用到了工作空间,具体一些原理在我的另外一篇博客。
打开Xcode->New->Workspace,命名为JSDSDKDemo
技术分享

为我们的工作空间建立一个目录,因为新建工作空间后,只会为我们生成一个工作空间文件,并不会自动建立目录。

技术分享

在我们的工作空间文件同级目录下建立一个用于存放子项目的SubProject目录。
技术分享

打开我们的JSDSDKDemo,新建一个项目,命名为JSSDKForDevelop,该项目主要用于SDK的测试,记得选择添加到JSDSDKDemo,最好不要选自动创建git仓库
技术分享

然后我们用同样的方法新建一个名为JSSDKInterfaceDemo,该项目用于给SDK使用者作为参考。

添加静态库相关依赖

很多开发者都是把SDK打包之后,然后拿到相关Demo里面进行测试,但是其实我们只需要添加相关依赖,就可以直接在Demo里面进行测试,只需要为它们创建依赖关系。

创建一个静态库项目,命名为JSDSDK,显而易见,该项目是该工作空间中的主要项目。
技术分享

为了工程的统一性,我们的SDK项目放在和SubProject同一级目录下。为了后续把SDK放到另外一个git模块上面去,我们可以为该SDK创建git工程。

技术分享

使用Add文件的方式把JSDSDK添加到JSSDKForDevelop里面,注意选Creat folder reference而不是选Create groups

技术分享

选择JSSDKForDevelop项目,在Build Phases-Tatget Dependencies添加JSSDK依赖。
技术分享

当然,有了这个还不足够,我们还需要在Header Search Paths里面添加SDK的路径。

技术分享

然后,我们在JSSDKForDevelop项目里面引用SDK项目的头文件并使用,我们可以看到可以正常使用,不会报路径相关的错误了,说明依赖没有问题。

技术分享

使用脚本来简化工作

我曾经也写过一篇文章[iOS 静态库打包流程简化](http://blog.csdn.net/zhouzhoujianquan/article/details/53192597)。
本次脚本在之前的项目之上做了一些改进。

首先为JSSDK创建一个运行脚本的target,New->Target

技术分享

选择Cross-platform->Aggregate,命名为JSSDK_Build_Script
技术分享

然后创建一个脚本文件,命名为JSSDK_Build

技术分享

为刚才建立的JSSDK_Build_Script添加Run Script Phase
技术分享

然后配置脚本路径
技术分享

这样SDK的自动化编译打包流程完成。

如何使用该工程

首先我们在在JSDSDK里面完成SDK相关功能的开发之后,可以直接使用JSSDKForDevelop对SDK相关的代码进行测试。然后运行JSSDK_Build_Script,即可把SDK进行相关的打包。

技术分享

打包成功后,会把JSSDKForDevelop的文件同步到JSSDKInterfaceDemo。同时会在SubProject目录下生成JSSDKInterfaceDemo的打包文件

技术分享

运行JSSDKInterfaceDemo测试SDK相关功能是否正常,如果正常则可以把SDK交付使用。

把SDK划分到Git的子模块进行管理

当然,更进一步我们可以使用git submodule把SDK分离出来。

添加

为当前工程添加submodule,命令如下:

git submodule add 仓库地址 路径

其中,仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径。
注意:路径不能以 / 结尾(会造成修改不生效)、不能是现有工程已有的目录(不能順利 Clone)

命令执行完成,会在当前工程根路径下生成一个名为.gitmodules的文件,其中记录了子模块的信息。添加完成以后,再将子模块所在的文件夹添加到工程中即可。

删除

submodule的删除稍微麻烦点:首先,要在.gitmodules文件中删除相应配置信息。然后,执行git rm –cached命令将子模块所在的文件从git中删除。

下载的工程带有submodule

当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:

git submodule update --init --recursive

为了方便大家学习demo,我的demo没有这样做,避免有些开发者在下载之后不能立刻使用会产生一些困扰。

最后附上Demo地址给大家学习,不足之处望批判指正。

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    一种比较实用的iOS SDK项目架构