所在公司是做定制化产品的,目前随着客户越来越多,而且每个客户的环境都是不一样的。每次发版的时候都要打好几个包。如果是一个个打包的话将会耗费大量的时间,测试的同学也等的很辛苦。于是开始探索批量化打包,以缩短等待打包的时间,提升工作效率。
我的思路是这样的:
先打出一个包,然后再解压,做为母包。然后根据配置,要打多少个包就循环,复制解压出的母包,然后根据定制化的需求分别修改子包里的配置文件,最后再重签名,压缩成子包。

1是打包运行的脚本,2是打包脚本读取的配置文件,3是项目工程读取的配置文件。打包时只需要运行这个autobuild脚本就行了。autobuild.py,脚本下载下来自己还需要根据情况进行配置。
跟往常一样,先实践,上代码步骤。首先,脚本是用python写的。以前也没接触过python,现学现用。
1.进入工程文件所在目录,如果是cocoapods管理的则进入到xxx.xcworkspace所在目录,否则进入到xxx.xcodeproj所在目录。
然后在此执行以下步骤打包命令。
编译并且导出.xcarchive包
'xcodebuild -workspace %s -scheme %s -configuration %s archive -archivePath %s -destination generic/platform=iOS' %(workspace, scheme, CONFIGURATION, archivePath)workspace和scheme分别是项目工程的scheme名称和workspace名称,CONFIGURATION是选择打Debug还是Release包,archivePath是编译完成后导出.xcarchive文件的目录以及文件名
导出.ipa包
"xcodebuild -exportArchive -archivePath %s -exportPath %s -exportOptionsPlist %s" %(archivePath, exportDirectory, EXPORT_OPTIONS_PLIST)archivePath是.xcarchive的路径,exportDirectory是导出ipa包的路径,EXPORT_OPTIONS_PLIST是配置文件。
上面已经打完了母包,并且已经知道了母包ipa的路径,接下来可以写自动分发到蒲公英或者fir,或者批量复制打子包。
2.根据母包的路径解压出母包,并且根据母包里面的mobileprovision生成entitlements.plist这是进行重新签名的重要步骤。
脚本代码如下:
|
|
其中os.path.join(current_path,'Payload/'+appFile+'/embedded.mobileprovision'这个是母包中embedded.mobileprovision的路径,os.path.join(current_path,'entitlements_full.plist')这个是根据embedded.mobileprovision生成entitlements_full.plist的路径,最终根据entitlements_full.plist生成entitlements.plist它的路径是这个os.path.join(current_path,'entitlements.plist')
3.读取配置文件循环复制母包分别进行定制化配置。然后进行重新签名。重签名脚本如下:
|
|
其中VERIFY_IDENTIFY_FILE是你的证书名称,os.path.join(current_path,'entitlements.plist')这个是上面步骤中生成的entitlements.plist路径,os.path.join(current_path,'childIpa/Payload/'+appFile)这个就是要签名的文件路径。
签名成功时终端会提示replacing existing signature代表重签名成功。
注意:
这个签名操作是对.app文件进行签名,并且在后台线程中进行,必须要等完全签名成功后才能进行后面的压缩打包操作。否则ipa包无法安装。
4.对.app文件压缩导出.ipa包。脚本如下:
|
|
其中os.path.join(current_path,'childIpa')是.app所在的目录。item['AppName']+'.ipa'这个是设置导出包的名称和后缀。最后,打包完成后删除中间复制过来的那个母包。导出的包在这里childipa文件夹里面
实践结束,这只是批量化打包的其中一种思路,还可以通过多target实现批量打包。想要深入了解的可以看下面资料。
参考资料
1.代码签名探析
2.iOS应用程序的重签名(打包)
3.iOS批量自动打包和部署(Ⅲ)
4.iOS命令行自动化集成打包全记录(多个target,多种环境)