iOS shell脚本实现xcodebuild编译打包+curl上传蒲公英、App Store+上传dSYM到Bugly

因Xcode手动编译打包太繁琐,最近简单实现了一个自动编译打包的shell脚本这里分享给大家。

实现功能:

  • 自动编译出xcarchive文件。
  • 自动打包导出ipa文件。
  • 自动将ipa上传App Store、蒲公英。
  • 自动压缩、上传dYSM(什么是dYSM?)文件到Bugly。
  • 三种设置versionbuild版本号模式:
    1、不做修改,保留当前版本。
    2、build号自动+1。
    3、随心设置versionbuild号。

准备工作:

  • 下载shell脚本
    首先请在这里下载文件shell文件,然后将文件夹里的b.shADHOCExportOptionsPlist.plistAppStoreExportOptionsPlist.plist放到你的工程根目录下(和你.xcodeproj文件同级)。
  • 重新配置属于你项目的ExportOptionsPlist文件
    最简单的配置方式是用你自己项目的ExportOptionsPlist文件替换刚刚放到你项目根目录中的ADHOCExportOptionsPlist.plistAppStoreExportOptionsPlist.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.xcarchivexxxxxx.ipa导出到~/Desktop桌面BuildIPAs文件夹中。

脚本简介:

  • 获取当前shell脚本所在文件夹路径,即工程的绝对路径,后面的一切基于这个路径开始,便于获取到工程文件。
#$0:当前Shell程序的文件名
#dirname $0,获取当前Shell程序的路径
#cd `dirname $0`,进入当前Shell程序的目录
#工程绝对路径
project_path=$(cd `dirname $0`; pwd)
  • 你需要替换的基本变量
# 工程名
project_name="替换成你的工程名字"
# scheme名
scheme_name="替换成你的scheme名字"
  • 获取日期和时间,用于设置存放xxxxxx.xcarchivexxxxxx.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获取项目的versionbuild版本号,即设置versionbuild版本号的三种模式模式。
#设置项目版本号
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
  • 上传dSYMsymbol``.zip文件到Bugly,关于Curl上传iOS符号表请看:Curl上传符号表
#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脚本内容,可以根据你的需要自行裁剪修改脚本内容,但是这一切的基础是配置好你项目的编译环境CertificatesProvisioning Profiles,从而获取正确的ExportOptionsPlist文件。

你可能感兴趣的:(iOS shell脚本实现xcodebuild编译打包+curl上传蒲公英、App Store+上传dSYM到Bugly)