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
#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文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容