因Xcode手动编译打包太繁琐,最近简单实现了一个自动编译打包的shell脚本这里分享给大家。
实现功能:
- 自动编译出
xcarchive
文件。 - 自动打包导出
ipa
文件。 - 自动将
ipa
上传App Store、蒲公英。 - 自动压缩、上传
dYSM
(什么是dYSM?)文件到Bugly。 - 三种设置
version
和build
版本号模式:
1、不做修改,保留当前版本。
2、build
号自动+1。
3、随心设置version
和build
号。
准备工作:
-
下载shell脚本
首先请在这里下载文件shell文件,然后将文件夹里的b.sh
、ADHOCExportOptionsPlist.plist
和AppStoreExportOptionsPlist.plist
放到你的工程根目录下(和你.xcodeproj
文件同级)。 -
重新配置属于你项目的ExportOptionsPlist文件
最简单的配置方式是用你自己项目的ExportOptionsPlist
文件替换刚刚放到你项目根目录中的ADHOCExportOptionsPlist.plist
和AppStoreExportOptionsPlist.plist
文件。至于生成ExportOptionsPlist
文件,你可以配置好项目证书后,使用Xcode分别用Debug和Release模式Archive,然后导出ipa
包,在ipa
包同级文件夹中就可以找到相应模式的ExportOptionsPlist文件。 -
配置属于你的脚本
替换b.sh脚本中的变量值,详情请看shell脚本。
执行脚本:
- 打开终端
cd
到你的项目根目录。 - 使用
./b.sh
指令执行脚本。 - 选择编译环境
Place enter the number you want to export ? [ 1:app-store 2:ad-hoc]
- 设置version和build版本号
Do you want to set a new version for xxxxx ? [ 1:NO 2:Build version + 1 3:YES ]
。
设置完编译环境和版本号后静待编译打包和上传,脚本默认将xxxxxx.xcarchive
和xxxxxx.ipa
导出到~/Desktop
桌面Build
和IPAs
文件夹中。
脚本简介:
- 获取当前shell脚本所在文件夹路径,即工程的绝对路径,后面的一切基于这个路径开始,便于获取到工程文件。
#$0:当前Shell程序的文件名
#dirname $0,获取当前Shell程序的路径
#cd `dirname $0`,进入当前Shell程序的目录
#工程绝对路径
project_path=$(cd `dirname $0`; pwd)
- 你需要替换的基本变量
# 工程名
project_name="替换成你的工程名字"
# scheme名
scheme_name="替换成你的scheme名字"
- 获取日期和时间,用于设置存放
xxxxxx.xcarchive
和xxxxxx.ipa
文件夹的后缀,便于之后查找相应的文件。
#包名后缀(日期+时间)
date="$(date "+%Y-%m-%d_%H-%M-%S")"
temp_date="_${date}"
- 获取你所选择编译环境,
read
用来获取终端输入的值,这里用来获取你所选择1、2
三种模式。
echo "Place enter the number you want to export ? [ 1:app-store 2:ad-hoc] "
#读取用户输入的信息
read number
while([[ $number != 1 ]] && [[ $number != 2 ]])
do
echo "Error! Should enter 1 or 2"
echo "Place enter the number you want to export ? [ 1:app-store 2:ad-hoc] "
read number
done
- 根据前面选择的编译环境,选择
ExportOptionsPlist
文件。
if [ $number == 1 ];then
development_mode=Release
exportOptionsPlistPath=${project_path}/AppStoreExportOptionsPlist.plist
else
development_mode=Debug
exportOptionsPlistPath=${project_path}/ADHOCExportOptionsPlist.plist
fi
- 通过
Info.plist
获取项目的version
和build
版本号,即设置version
和build
版本号的三种模式模式。
#设置项目版本号
mainVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" ${project_path}/${project_name}/Info.plist)
mainBuild=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" ${project_path}/${project_name}/Info.plist)
new_mainVersion=$mainVersion
new_mainBuild=$mainBuild
echo "${project_name} version:$mainVersion build:$mainBuild"
echo "Do you want to set a new version for ${project_name} ? [ 1:NO 2:Build version + 1 3:YES ] "
#
read v_number
while([[ $v_number != 1 ]] && [[ $v_number != 2 ]] && [[ $v_number != 3 ]])
do
echo "Error! Should enter 1 、2、3"
echo "Do you want to set a new version for ${project_name} ? [ 1:YES 2:NO 3:Build version + 1 ] "
read v_number
done
#
if [ $v_number == 1 ];then
echo "/+++++++ 未更改版本号 +++++++/"
elif [[ $v_number == 2 ]]; then
#build + 1
new_mainBuild=$((${mainBuild} + 1))
else
echo "Please enter a new version:?"
read version
new_mainVersion=$version
echo "Please enter a new build:?"
read build
new_mainBuild=$build
fi
# 设置新的Version 和 Build
plutil -replace CFBundleShortVersionString -string $new_mainVersion ${project_path}/${project_name}/Info.plist
plutil -replace CFBundleVersion -string $new_mainBuild ${project_path}/${project_name}/Info.plist
- 使用xcodebuild编译打包项目
echo '/+++++++ 正在清理工程 +++++++/'
xcodebuild \
clean -configuration ${development_mode} -quiet || exit
echo '/+++++++ 清理完成 +++++++/'
echo '正在编译工程:'${development_mode}
xcodebuild \
archive -workspace ${project_path}/${project_name}.xcworkspace \
-scheme ${scheme_name} \
-configuration ${development_mode} \
-archivePath ${build_path}/${project_name}.xcarchive -quiet || exit
echo '/+++++++ 编译完成 +++++++/'
echo '/+++++++ 开始ipa打包 +++++++/'
xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive \
-configuration ${development_mode} \
-exportPath ${exportIpaPath} \
-exportOptionsPlist ${exportOptionsPlistPath} \
-quiet || exit
# 判断IPAs内是否有ipa包
if [ -e $exportIpaPath/$scheme_name.ipa ]; then
echo '/+++++++ ipa包已导出 +++++++/'
open $exportIpaPath
else
echo '/+++++++ ipa包导出失败 +++++++/'
fi
- 根据前面选择的编译环境将
ipa
包上传到App Store或蒲公英(关于curl上传蒲公英),这里要替换相应的apple id 和蒲公英user key、api key等参数。上传成功过后mv $exportIpaPath $exportIpaPath$append_path
这里使用mv
指令修改文件夹名称用于区分上传平台。最终存放ipa
包的文件夹的名称由工程名称
、时间
、版本号
和平台名称
组成。
if [ $number == 1 ];then
#上传App Store
echo '/+++++++ 上传App Store +++++++/'
#验证并上传到App Store
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 这里是你的appleid -p 这里是你的密码 -t ios --output-format xml
"$altoolPath" --upload-app -f ${exportIpaPath}/${scheme_name}.ipa -u 这里是你的appleid -p 这里是你的密码 -t ios --output-format xml
append_path="已上传到App Store"
# 修改存放ipa包文件夹路径,添加后缀,以便区分上传平台
mv $exportIpaPath $exportIpaPath$append_path
echo '/+++++++ 成功上传到App Store +++++++/'
else
#上传蒲公英
echo '/+++++++ 上传蒲公英 +++++++/'
PASSWORD=123456
#将git最后一次提交作为更新说明
MSG=`git log -1 --pretty=%B`
curl -F "file=@$exportIpaPath/$scheme_name.ipa" \
-F "uKey=蒲公英的user key" \
-F "_api_key=蒲公英的api key" \
-F "updateDescription=${MSG}" \
-F "password=${PASSWORD}" \
https://qiniu-storage.pgyer.com/apiv1/app/upload
append_path="已上传到蒲公英"
mv $exportIpaPath $exportIpaPath$append_path
echo '/+++++++ 成功上传到蒲公英 +++++++/'
fi
#Bugly
buglyAppKey="替换成你的bugly app key"
buglyAppId="替换成你的bugly app id"
bundleId="替换成你的bundle id"
echo '/+++++++ 压缩dSYM文件 +++++++/'
cd $build_path/$project_name.xcarchive/dSYMs
zip -r -o project_name.app.dSYM.zip "${project_name}.app.dSYM"
echo '/+++++++ 压缩dSYM文件完成 +++++++/'
echo '/+++++++ 上传dSYM文件 +++++++/'
curl -k "https://api.bugly.qq.com/openapi/file/upload/symbol?app_key=$buglyAppKey&app_id=$buglyAppId" --form "api_version=1" --form "app_id=$buglyAppId" --form "app_key=$buglyAppKey" --form "symbolType=2" --form "bundleId=${bundleId}" --form "productVersion=${new_mainVersion}(${new_mainBuild})" --form "channel=appstore" --form "fileName=$project_name.app.dSYM.zip" --form "file=@$build_path/$project_name.xcarchive/dSYMs/$project_name.app.dSYM.zip" --verbose
echo '\n/+++++++ 上传dSYM文件结束 +++++++/'
echo '/+++++++ 压缩symbol文件 +++++++/'
cd $build_path/$project_name.xcarchive
zip -r -o 'symbol.zip' "BCSymbolMaps"
echo '\n/+++++++ 压缩symbol文件结束 +++++++/'
echo '/+++++++ 上传Symbol文件 +++++++/'
curl -k "https://api.bugly.qq.com/openapi/file/upload/symbol?app_key=$buglyAppKey&app_id=$buglyAppId" --form "api_version=1" --form "app_id=$buglyAppId" --form "app_key=$buglyAppKey" --form "symbolType=2" --form "bundleId=${bundleId}" --form "productVersion=${new_mainVersion}(${new_mainBuild})" --form "fileName=symbol.zip" --form "file=@$build_path/$project_name.xcarchive/symbol.zip" --verbose
echo '/+++++++ 上传Symbol文件结束 +++++++/'
以上便是整个iOS自动编译打包的shell脚本内容,可以根据你的需要自行裁剪修改脚本内容,但是这一切的基础是配置好你项目的编译环境Certificates
和Provisioning Profiles
,从而获取正确的ExportOptionsPlist
文件。