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