因Xcode手動編譯打包太繁瑣,最近簡單實現(xiàn)了一個自動編譯打包的shell腳本這里分享給大家芒划。
實現(xiàn)功能:
- 自動編譯出
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腳本坟比。
執(zhí)行腳本:
- 打開終端
cd
到你的項目根目錄芦鳍。 - 使用
./b.sh
指令執(zhí)行腳本。 - 選擇編譯環(huán)境
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 ]
葛账。
設置完編譯環(huán)境和版本號后靜待編譯打包和上傳柠衅,腳本默認將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}"
- 獲取你所選擇編譯環(huán)境闻丑,
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
- 根據(jù)前面選擇的編譯環(huán)境勋锤,選擇
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內(nèi)是否有ipa包
if [ -e $exportIpaPath/$scheme_name.ipa ]; then
echo '/+++++++ ipa包已導出 +++++++/'
open $exportIpaPath
else
echo '/+++++++ ipa包導出失敗 +++++++/'
fi
- 根據(jù)前面選擇的編譯環(huán)境將
ipa
包上傳到App Store或蒲公英(關(guān)于curl上傳蒲公英)谈宛,這里要替換相應的apple id 和蒲公英user key、api key等參數(shù)胎署。上傳成功過后mv $exportIpaPath $exportIpaPath$append_path
這里使用mv
指令修改文件夾名稱用于區(qū)分上傳平臺吆录。最終存放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包文件夾路徑哀卫,添加后綴,以便區(qū)分上傳平臺
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文件結(jié)束 +++++++/'
echo '/+++++++ 壓縮symbol文件 +++++++/'
cd $build_path/$project_name.xcarchive
zip -r -o 'symbol.zip' "BCSymbolMaps"
echo '\n/+++++++ 壓縮symbol文件結(jié)束 +++++++/'
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文件結(jié)束 +++++++/'
以上便是整個iOS自動編譯打包的shell腳本內(nèi)容此改,可以根據(jù)你的需要自行裁剪修改腳本內(nèi)容,但是這一切的基礎是配置好你項目的編譯環(huán)境Certificates
和Provisioning Profiles
侄柔,從而獲取正確的ExportOptionsPlist
文件带斑。