iOS脚本自动化打包方案--xcodebuild
本文主要xcodebuild脚本自动化打包并上传到蒲公英或者AppStore,废话不多说,直接上干货!
先了解一下xcodebuild打包需要的一些指令
-workspace XXX.xcworkspace
XXX.xcworkspace需要编译工程的工作空间名称,如果工程不是.xcworkspace的,可以不需要-workspace XXX.xcworkspace这段话
-scheme XXX
XXX是工程名称,-scheme XXX是指定构建工程的名称
-configuration Release
填入打包的方式是Debug或Release,就跟在Xcode中编译前需要在Edit scheme的Build configuration中选择打出来的包是Debug还是Release包一样,-configuration就是配置编译的Build configuration
-archivePath ./myArchivePath
配置生成.xcarchive的路径, ./表示生成在当前目录下,myArchivePath是生成的.Archive文件名称
ODE_SIGN_IDENTITY=证书
配置打包的指定证书,如果该工程的Xcode已经配置好了证书,那么不加入这段话也可以,打包出来的证书就是Xcode中配置好的。
PROVISIONING_PROFILE=描述文件UUID
配置打包的描述文件,同上,Xcode已经配置好了就不用在填入这段话了
CONFIGURATION_BUILD_DIR
配置编译文件的输出路径,如果需要用到.xcarchive文件内部的dSYM等文件,可以使用改字段指定输出路径。
如果工程是勾选了Automatically manage signing,那么就不用在配置ODE_SIGN_IDENTITY和PROVISIONING_PROFILE,今天这里讲到的Automatically manage signing自动配置证书,手动配置的就不多说了,有兴趣的话可以自己研究。
xcode工程配置自动获取证书,如下图:
打包所需要文件
配置打包的ExportOptions.plist文件,可以在任意一个Xcode工程中新建一个ExportOptions.plist文件。dev和adHoc和AppStore的配置文件内容不一样,可以先手动打包后看下plist文件的样式,这里提供一个样例:
这里method对应的value为打包对应的环境,有development、ad-hoc、app-store、enterprise根据打包环境来配置不同的值
编译脚本命令
xcodebuild archive -workspace XXX.xcworkspace -scheme XXX -configuration Release -archivePath ./myArchivePath CONFIGURATION_BUILD_DIR ./dir ODE_SIGN_IDENTITY=证书 PROVISIONING_PROFILE=描述文件UUID
导出ipa包命令
xcodebuild -exportArchive -archivePath ./myArchivePath.xcarchive -exportOptionsPlist ./ExportOptions.plist -exportPath ./out
-archivePath ./myArchivePath.xcarchive指定需要打包的.xcarchive路径,./myArchivePath.xcarchive表示在当前终端路径下的myArchivePath.xcarchive文件
-exportOptionsPlist ./ExportOptions.plist指定打包需要的ExportOptions.plist配置文件路径
-exportPath ./out指定打包输出的路径, ./out表示打包结果输出在终端的当前路径下的out文件家中。如果没有out文件夹会自动创建一个
脚本操作
首先:cd到需要自动打包的工程下
然后:在终端中输入touch xcodebuild.sh创建xcodebuild.sh脚本文件
然后:双击打开脚本写入下面 脚本内容(请确保所有版本的plist配置文件都写好了)
最后:在终端中输入./xcodebuild.sh运行脚本,按照步骤完成打包选择(如果运行的时候出现Permission denied,请先在终端中执行chmod a+x *.文件的后缀名后,在运行,相当于提高脚本文件的权限)
脚本内容
此脚本包含了自动上传蒲公英的选择操作,根据输入指令来执行具体操作
脚本实现
Workspace_Name="***.xcworkspace"
#工程名字
Project_Name="***"
#配置打包方式Release或者Debug
Configuration="Release"
#在终端中提示 根据输入的序号不同,打包成不同版本的ipa
echo "~~~~~~~~~~~~选择打包环境(输入序号)~~~~~~~~~~~~~~~"
echo " 1 Debug"
echo " 2 Release"
# 读取用户在终端中输入并存到变量里
readparameter_dev
sleep0.5
method_dev="$parameter_dev"
# 判读用户是否有输入
if[ -n"$method_dev"]
then
if["$method_dev"="1"]
then
Configuration="Debug"
echo "~~~~~~~~~~~~即将进行Debug环境打包~~~~~~~~~~~~~~~"
elif["$method_dev"="2"]
then
Configuration="Release"
echo "~~~~~~~~~~~~即将进行Release环境打包~~~~~~~~~~~~~~~"
fi
fi
#基础主路径
BUILD_PATH=./build
#不同版本的基础子路径
#dev
DEV_PATH=${BUILD_PATH}/dev
#adHoc
ADHOC_PATH=${BUILD_PATH}/adHoc
#appStore
APPSTORE_PATH=${BUILD_PATH}/appStore
#enterprise
ENTERPRISE_PATH=${BUILD_PATH}/enterprise
#配置打包结果输出的路径
#dev版本
DevProjectOutPath=${DEV_PATH}/devOut
#AdHoc版本
AdHocProjectOutPath=${ADHOC_PATH}/adHocOut
#AppStore版本
AppStoreProjectOutPath=${APPSTORE_PATH}/appStoreOut
#企业版本
EnterpriseProjectOutPath=${ENTERPRISE_PATH}/enterpriseOut
#加载各个版本的plist文件
DEVExportOptionsPlist="./ExportOptions/ExportOptions-dev.plist"
ADHOCExportOptionsPlist="./ExportOptions/ExportOptions-adhoc.plist"
AppStoreExportOptionsPlist="./ExportOptions/ExportOptions-appStore.plist"
EnterpriseExportOptionsPlist="./ExportOptions/ExportOptions-enterprise.plist"
#在终端中提示 根据输入的序号不同,打包成不同版本的ipa
echo "~~~~~~~~~~~~选择打包方式(输入序号)~~~~~~~~~~~~~~~"
echo " 1 dev"
echo " 2 adHoc"
echo " 3 AppStore"
echo " 4 Enterprise"
# 读取用户在终端中输入并存到变量里
readparameter
sleep0.5
method="$parameter"
# 判读用户是否有输入
if[ -n"$method"]
then
if["$method"="1"]
then
#这里都执行命令中是在xcworkspace工程中执行的,如果工程不是xcworkspace,可以把-workspace的内容删掉,加入了证书和描述文件,如果不需要请删除
#如果用户选择的是1,就执行dev脚本
#首先清除原来的文件夹
rm -rf ${BUILD_PATH}
#创建文件夹,路径需要一层一层创建,不然会创建失败
mkdir ${BUILD_PATH}
mkdir ${DEV_PATH}
#打包输出的文件
mkdir ${DevProjectOutPath}
#编译
xcodebuild archive -workspace $Workspace_Name -scheme $Project_Name -configuration $Configuration -archivePath ${DEV_PATH}/$Project_Name-dev.xcarchive -allowProvisioningUpdates
#打包
xcodebuild -exportArchive -archivePath ${DEV_PATH}/$Project_Name-dev.xcarchive -exportOptionsPlist $DEVExportOptionsPlist -exportPath ${DevProjectOutPath}
#上传操作
uploadPGY ${DevProjectOutPath} ${Project_Name}
elif["$method"="2"]
then
#这里都执行命令中是在xcworkspace工程中执行的,如果工程不是xcworkspace,可以把-workspace的内容删掉,加入了证书和描述文件,如果不需要请删除
#如果用户选择的是2,就执行adhoc脚本
#首先清除原来的文件夹
rm -rf ${BUILD_PATH}
#创建文件夹,路径需要一层一层创建,不然会创建失败
mkdir ${BUILD_PATH}
mkdir ${ADHOC_PATH}
#打包输出的文件
mkdir ${AdHocProjectOutPath}
#编译
xcodebuild archive -workspace $Workspace_Name -scheme $Project_Name -configuration $Configuration -archivePath ${ADHOC_PATH}/$Project_Name-adhoc.xcarchive -allowProvisioningUpdates
xcodebuild -exportArchive -archivePath ${ADHOC_PATH}/$Project_Name-adhoc.xcarchive -exportOptionsPlist $ADHOCExportOptionsPlist -exportPath ${AdHocProjectOutPath}
#上传操作
uploadPGY ${AdHocProjectOutPath} ${Project_Name}
elif["$method"="3"]
then
#如果用户选择的是3,就执行appstore脚本
#首先清除原来的文件夹
rm -rf ${BUILD_PATH}
#创建文件夹,路径需要一层一层创建,不然会创建失败
mkdir ${BUILD_PATH}
mkdir ${APPSTORE_PATH}
#打包输出的文件
mkdir ${AppStoreProjectOutPath}
xcodebuild archive -workspace $Workspace_Name -scheme $Project_Name -configuration $Configuration -archivePath ${APPSTORE_PATH}/$Project_Name-appstore.xcarchive -allowProvisioningUpdates
xcodebuild -exportArchive -archivePath ${APPSTORE_PATH}/$Project_Name-appstore.xcarchive -exportOptionsPlist $AppStoreExportOptionsPlist -exportPath ${AppStoreProjectOutPath}
#验证ipa是否打包成功
if[ -e $AppStoreProjectOutPath/$Project_Name.ipa ];then
echo '----ipa包已生成----'
open $AppStoreProjectOutPath
echo '----打包ipa完成----'
echo '**---------------**'
echo '****开始发布ipa包****'
echo '**---------------**'
#验证后上传到App Store
# 将-u 后面的XXX替换成自己的AppleID的账号,-p后面的XXX替换成自己的密码
altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"
"$altoolPath"--validate-app -f ${exportIpaPath}/${scheme_name}.ipa -u XXX -p XXX -t ios --output-format xml
"$altoolPath"--upload-app -f ${exportIpaPath}/${scheme_name}.ipa -u XXX -p XXX -t ios --output-format xml
else
echo '----ipa包导出失败----'
fi
elif["$method"="4"]
then
#如果用户选择的是4,就执行企业脚本
#首先清除原来的文件夹
rm -rf ${BUILD_PATH}
#创建文件夹,路径需要一层一层创建,不然会创建失败
mkdir ${BUILD_PATH}
mkdir ${ENTERPRISE_PATH}
#打包输出的文件
mkdir ${EnterpriseProjectOutPath}
xcodebuild archive -workspace $Workspace_Name -scheme $Project_Name -configuration $Configuration -archivePath ${ENTERPRISE_PATH}/$Project_Name-enterprise.xcarchive -allowProvisioningUpdates
xcodebuild -exportArchive -archivePath ${ENTERPRISE_PATH}/$Project_Name-enterprise.xcarchive -exportOptionsPlist $EnterpriseExportOptionsPlist -exportPath ${EnterpriseProjectOutPath}
#上传操作
uploadPGY ${EnterpriseProjectOutPath} ${Project_Name}
else
#如果是其他输入,则在终端中提示参数无效并退出
echo "参数无效...."
exit 1
fi
fi```
**上传蒲公英**
```#上传蒲公英
uploadPGY(){
echo "~~~~~~~~~~~~选择完成是否上传蒲公英(输入序号)~~~~~~~~~~~~~~~"
echo " 1 上传"
echo " 2 不上传"
readuploadPara
sleep0.5
upload="$uploadPara"
# 判读用户是否有输入
if[ -n"$upload"]
then
if["$upload"="1"]
then
echo "~~~~~~~~~~~~即将进行上传蒲公英~~~~~~~~~~~~~~~"
echo "****** 开始上传IPA包到蒲公英 ******"
filePath=$1/$2.ipa
echo "~~~~~~~~~~~~filePath为$filePath~~~~~~~~~~~~"
U_key="your u_key"
APP_KEY="your app_key"
if[ -e"${filePath}"];then
echo "进入上传"
curl -F"file=@${filePath}"\
-F"uKey=${U_key}"\
-F"_api_key=${APP_KEY}"\
"http://www.pgyer.com/apiv1/app/upload"
echo "****** IPA包上传到蒲公英成功 ******"
else
echo "IPA包不存在 上传蒲公英失败"
fi
elif["$upload"="2"]
then
echo "~~~~~~~~~~~~打包结束~~~~~~~~~~~~~~~"
fi
fi
}
具体详细脚本见GitHub地址:https://github.com/Luck-666/xcodebuild.sh.git 如果好用记得给star,谢谢!
如脚本打包执行遇到问题可留言沟通!