fir提供了很不错的自动化打包脚本,传送门如下
https://github.com/FIRHQ/fir-cli/blob/master/README.md
不过实战的时候,会遇到一些坑,这里整理一下经验
最简单的打包命令如下:
firbuild_ipa
这样会自动打包ipa,不过会输出到一个临时目录,如
Results at '/var/folders/ky/syfrlzpn2bb8fmn5pr51tstm0000gp/T/d20160306-64805-akfs4h/1457249301.ipa'
对于一个CI平台来说,这样的存放路径毫无意义,所以一般会这样写
firbuild_ipa-o ./
这样就会把ipa拷贝到当前目录,命名规则是bundledisplayname+bundleversion+build号,还是挺不错的命名方式。
接下来我们考虑一下,如果是使用了Pod的项目,需要怎么处理:
podinstall; fir build_ipa -w workspace路径 -Crelease-S scheme名字
以上命令很容易理解,先把pod需要的东西配置好,然后用自动生成的workspace来打包。
遗留一个问题,如果是一个全新的项目,第一次pod install以后是不会自动生成scheme的,必须要用xcode显式打开一下,目前还没解决这个问题
到这里还是可以满足需求的,不过我们还要考虑更通用的CI场景。对于CI所在的服务器来说,应该是预先不知道开发者账号密码的(业务解耦)。这样的话,要求新开CI任务的时候,业务方上传provision文件和p12文件即可。
所以如果在这种场景下,以上的命令会报错
CodeSignerror:Nomatching provisioning profiles found:Noprovisioning profiles with a valid signing
fir的团队显然考虑到了这种场景,提供了一个额外的参数:
-f, [--profile=PROFILE]# Set the export provisioning profile
然而,如果你直接使用的话,xcode7的环境下应该会报如下错误:
xcodebuild:error: The flag -exportArchiveisrequiredwhenspecifying -exportProvisioningProfile.xcodebuild:error: The flag -archivePathisrequiredwhenspecifying -exportArchive.
xcodebuild的帮助文档是查不到这个参数的,我隐隐觉得不妙了。不过还是根据上述提示加上了-exportArchive和-archivePath,这下fir不干了,直接跳到了帮助界面,表示不认识这两个参数。
好吧,幸好fir的脚本是开源的,如此小bug是不是修改一下build_ipa这个函数就好了?然而为了保险,我还是先转换成命令行运行一下,然后就收到了如此的错误:
xcodebuild:error: The flag -scheme cannot be specified alongwith-exportArchive.
╮╯_╰╭搞毛,原来想用exportArchive就不能指定scheme,但是想要用workspace编译又要指定scheme,死循环了咋办?!
好的,为了理清思路,我们还是先搞清楚,exportArchive,exportProvisioningProfile之类的参数应该怎么用,然后就会找到这篇文章
http://www.thecave.com/2014/09/16/using-xcodebuild-to-export-a-ipa-from-an-archive/
简单来说这个外国人的意思是这样的,先用archive命令把做一次归档,然后再用exportArchive的方式给二进制文件指定provision文件签名。
思路是简单的,可惜现实还是残酷的,上面已经提到了,如果本地没有签名文件的话,xcodebuild的最后一步,会提示签名失败。又死循环了?!
这个时候google起到了关键的作用,万能的SO上面,有水友已经解决了这个问题
http://stackoverflow.com/questions/11034133/building-ios-applications-using-xcodebuild-without-codesign
黑科技宏定义:CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO,让你解决打包签名的困扰。
所以,如果想用fir打一个无签名的包,可以如下指定
firbuild_ipa-w workspace路径 -C release -Sscheme名字CODE_SIGN_IDENTITY=""CODE_SIGNING_REQUIRED=NO
如此就会输出一个无签名的ipa文件,解压发现Payload目录下,并没有_CodeSignature目录。
接下来的思路就很明确了,我们再补上重签名流程即可,推荐这篇文章的教程,有附上可用的脚本
http://www.ifun.cc/blog/2014/02/22/ios-appzhong-xin-qian-ming-fang-fa-jie-shao/
最后再补一下,如果想要做到更完美,可以自行解析provision文件里面的TeamName和TeamIdentifier,然后再丢给resign.sh处理,这样resign.sh也不需要业务方提供了。