iOS开发中自动构建工具相对于Android开发还是比较少的,由于公司项目有需求,就现写了一个,原理比较简单,目前还没有添加远程构建功能,有兴趣可以自己加上。这里我就分析这个小工具的实现原理和能够给开发者提供哪些便捷。
传统打包iOS程序
大家一般打包iOS程序都是直接使用 XCode -> Product -> Archive 工具进行打包,但是这样做有哪些不便之处?
1.每次打包都得联网验证,如果网速慢,大家都懂的。
2.每次打包都得打开XCode,并手动修改一些必要配置才能开始打包。
3.如果一份源码需要同时打包到测试和生产环境,这个时候我们还得每次打包都检查环境控制标识。
4.如果一份源码需要打包出很多份APP,比如我们公司需要为一些客户提供拥有他们自己标识的APP,这个时候我们如果手动打包,先不说每次迭代管理代码多么麻烦,就连每次打包需要修改配置、替换素材,确保各项配置都没有错误,这也是一项非常繁琐的工作。
自动打包iOS程序
既然手动打包不能满足我们的需求了,那我们应该怎么去解决呢?这个时候我们就能想到XCode自动打包命令xcodebuild了,使用xcodebuild就能不通过XCode,直接使用终端进行打包我们的app。有了这个前提,我们就能开发一些针对自己需求的工具,来管理我们的项目迭代了。
那如何去实现这个自动打包工具呢?
这个就得从我们自身需求出发了,以我们公司需求为例:
1.每次更新app都需要使用同一份源码打包多份app。
2.每一份app里需要管理不同的版本,不同的素材、不同的项目配置信息等等。
就像上面说的一样,如果我们使用手动打包,每次迭代版本我就得做很多次重复工作,而且这些重复工作是非常容易出错的(比如少替换了一张素材、少修改了一个标识啥的)。这个时候首先想到的是把每个项目需要修改的部分写一个配置清单,然后在打包前从外部去修改和替换这些配置项。这样我们只需要准备好相同的配置清单和打包脚本,写一个便于管理的图形工具即可。
实现原理
上面是对我们的需求和如何实现进行了简单分析,下面来看具体代码如何实现。
本文不会涉及到具体代码,只会提供一个思路给大家。工具代码和打包shell脚本可以在文章底部获取到,写得比较粗糙,大家仅作为参考即可。
首先布局一个简单的表单界面,表单里的数据我们可以直接写死到项目里,也可以写一个配置文件进行读取。我这里是直接写死到项目里,选择不同OEM会切换不同的配置数据,并使用NSUserDefaults保存配置信息以便下次使用。
界面左边的TableView是用来显示我们替换配置时是否发生了错误,如果全部OK则表示配置替换成功,可以进行打包操作。
清理列表:这个不用说了,就是清空TableView的数据源数组并刷新一下表格即可。
保存配置:修改表单数据后我们可以把数据保存到偏好设置,以便下次直接使用。
单个打包:直接使用shell脚本来打包当前选择的OEM。
打包所有:这个功能遇到了一点问题,打包单个app我可以直接开启子线程在后台线程进行操作,这样不会卡住我们的界面。但是如果是多个打包,我们需要先进行替换配置,然后调用打包shell进行打包,打包一个OEM完毕之后再次替换配置,再次打包。如果我们使用开启子线程来操作,这样替换的配置就会全部是最后一个OEM的信息。如果我们把替换操作也放到子线程中,又会引发一些其他问题,但这个问题是可以解决的,大家自己思考哈。
遇到的问题:
执行xcodebuild命令需要获取管理权限,如果我们直接用代码执行那是不会成功的。所以我在打包参数界面提供了填写当前电脑管理员账号和密码的表单,然后用正则替换到shell脚本里即可。其他替换操作都是使用正则,而且都比较简单,这里就不提了。还有文件管理这块我在工作中很少用到,这里也只是对文件进行判断是否存在、读取文件内容、删除文件、创建文件等操作,并且有些地方可能不是最好的方式,大家有意见可以跟我回复,也可以在github提交Issues给我哦。
打包脚本和工具代码都在这里,你不能直接使用,需要根据自己的需求修改一些配置。
https://github.com/6ag/OEM-Tools