ios-shell自動(dòng)打包上傳AppStore+版本號(hào)自增(自動(dòng)證書配置)

一膝宁、說明

最近需要上傳appstroe,每次長(zhǎng)傳都要等待很久根吁,于是就在網(wǎng)上找自動(dòng)上傳的資料员淫,方法有好幾種Jenkins、fastlane击敌,應(yīng)為只是簡(jiǎn)單的上傳appstroe介返,最后選擇了使用xcodebuild。

參考文章找了很久沒找到沃斤,如有看到提醒我加上圣蝎。
使用前需要安裝安裝xcodebuild

二、步驟簡(jiǎn)單介紹(最后代碼中已有注釋)

1.清除前面生成的編譯衡瓶、打包文件
xcodebuild clean -workspace ${Project_Name}.xcworkspace -scheme ${Project_Name} -configuration ${Configuration}

2.編譯
xcodebuild archive \ -workspace ${Project_Name}.xcworkspace -scheme ${Project_Name} -configuration ${Configuration} -archivePath ${APPSTORE_PATH}/${Project_Name}-appstore.xcarchive

3.打ipa包捅彻,自動(dòng)證書需要加上-allowProvisioningUpdates
xcodebuild -exportArchive \ -archivePath ${APPSTORE_PATH}/${Project_Name}-appstore.xcarchive -exportOptionsPlist ${AppStoreExportOptionsPlist} -exportPath ${AppStorePrijectOutPath} -allowProvisioningUpdates

4.使用altool驗(yàn)證和上傳ipa包
初步驗(yàn)證ipa包,這里我需要驗(yàn)證包是否初步驗(yàn)證成功需要鞍陨,將驗(yàn)證結(jié)果導(dǎo)出到plist中> ${APPSTORE_PATH}/validateInfo.plist步淹,如果驗(yàn)證成功會(huì)有一個(gè)成功的keysuccess-message
獲取plist中的key-value語法/usr/libexec/PlistBuddy -c "Print success-message" ${APPSTORE_PATH}/validateInfo.plist

蘋果官網(wǎng)術(shù)語表
xcrun altool --validate-app -f file -t platform -u username [-p password] [--output-format xml]
xcrun altool --upload-app -f file -t platform -u username [-p password] [--output-format xml]

5.最后是xcode中版本號(hào)自增从隆,用到agvtool
5.1.agvtool next-version -all就能自動(dòng)增加build號(hào)了,但是是整數(shù)缭裆,我這里直接用的整數(shù)键闺,如果需要像x.x.x這樣,可以參考下面代碼中設(shè)置bundle identifier
5.2.獲取當(dāng)前版本的keyCFBundleShortVersionString
/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" ${Project_Name}/Info.plist
5.3.設(shè)置版本號(hào)
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $newVersionStr" "${Project_Name}/Info.plist"

三澈驼、使用步驟

1.在.xcodeproj文件夾下創(chuàng)建shell.sh文件辛燥、ExportOptions.plist文件,ExportOptions.plist可以自己先手動(dòng)打包一次缝其,就會(huì)有生產(chǎn)這個(gè)plist
2.把下面代碼復(fù)制到.sh中,Workspace_Name挎塌、Project_Name、AppleID 與 密碼
3.xcode需要設(shè)置target -> info -> Bundle version和Bundle version string (short)用于版本自增
4.終端cd到.xcodeproj文件夾下内边、執(zhí)行./shell.sh

#workspace的名字榴都,如果沒有則不需要這段話,我測(cè)試工程不是一個(gè)工作空間所以就沒用漠其,如果需要用的話嘴高,還需要在編譯階段的腳本代碼里加上 -workspace ${Project_Name}.xcworkspace
Workspace_Name="項(xiàng)目bundle identifier"
#工程名字
Project_Name="項(xiàng)目bundle identifier"
#配置打包方式Release或者Debug
Configuration="Release"

#基礎(chǔ)主路徑
BUILD_PATH=./build
#不同版本的基礎(chǔ)子路徑
#adHoc
ADHOC_PATH=${BUILD_PATH}/adHoc
#appStore
APPSTORE_PATH=${BUILD_PATH}/appStore

#配置編譯文件的存放地址
#adHoc
CONFIGURATION_BUILD_PATH_ADHOC=${ADHOC_PATH}/${Configuration}-iphoneos
#appStore
CONFIGURATION_BUILD_PATH_APPSTORE=${APPSTORE_PATH}/${Configuration}-iphoneos

#配置打包結(jié)果輸出的路徑
#AdHoc版本
AdHocPrijectOutPath=${ADHOC_PATH}/adHocOut
#AppStore版本
AppStorePrijectOutPath=${APPSTORE_PATH}/appStoreOut

#上傳appstroe和ad-hoc配置不同,需要自行配置
ADHOCExportOptionsPlist="./ExportOptions.plist"
AppStoreExportOptionsPlist="./ExportOptions.plist"

#在終端中提示 根據(jù)輸入的序號(hào)不同和屎,打包成不同版本的ipa
echo "~~~~~~~~~~~~選擇打包方式(輸入序號(hào))~~~~~~~~~~~~~~~"
echo "  1 adHoc"
echo "  2 AppStore"

# 讀取用戶在終端中輸入并存到變量里
read parameter
sleep 0.5
method="$parameter"

# 判讀用戶是否有輸入
if [ -n "$method" ]
then

#clean 每次先清空之前打包好的文件
xcodebuild clean \
-workspace ${Project_Name}.xcworkspace \
-scheme ${Project_Name} \
-configuration ${Configuration}

if [ "$method" = "1" ]
then

#這里都執(zhí)行命令中是在xcworkspace工程中執(zhí)行的拴驮,如果工程不是xcworkspace,可以把-workspace的內(nèi)容刪掉柴信,加入了證書和描述文件套啤,如果不需要請(qǐng)刪除
#如果用戶選擇的是1,就執(zhí)行adhoc腳本
rm -rf ${BUILD_PATH}
#創(chuàng)建文件夾随常,路徑需要一層一層創(chuàng)建潜沦,不然會(huì)創(chuàng)建失敗
mkdir ${BUILD_PATH}
mkdir ${ADHOC_PATH}
#編譯文件
mkdir ${CONFIGURATION_BUILD_PATH_ADHOC}
#打包輸出的文件
mkdir ${AdHocPrijectOutPath}
#copy
mkdir ${DSYM_COPY_PATH_ADHOC}

#編譯
#自動(dòng)證書配置需要加上這個(gè)-allowProvisioningUpdates
xcodebuild archive \
-workspace ${Project_Name}.xcworkspace \
-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 ${AdHocPrijectOutPath} -allowProvisioningUpdates

elif [ "$method" = "2" ]
then

rm -rf ${BUILD_PATH}
#創(chuàng)建文件夾,路徑需要一層一層創(chuàng)建线罕,不然會(huì)創(chuàng)建失敗
mkdir ${BUILD_PATH}
mkdir ${APPSTORE_PATH}
#編譯文件
mkdir ${CONFIGURATION_BUILD_PATH_APPSTORE}
#打包輸出的文件
mkdir ${AppStorePrijectOutPath}
#xcarchive
mkdir ${DSYM_COPY_PATH_APPSTORE}
xcodebuild archive \
-workspace ${Project_Name}.xcworkspace \
-scheme ${Project_Name} \
-configuration ${Configuration} \
-archivePath ${APPSTORE_PATH}/${Project_Name}-appstore.xcarchive \
#ipa
#自動(dòng)證書配置需要加上這個(gè)-allowProvisioningUpdates
xcodebuild  -exportArchive \
-archivePath ${APPSTORE_PATH}/${Project_Name}-appstore.xcarchive \
-exportOptionsPlist ${AppStoreExportOptionsPlist} \
-exportPath ${AppStorePrijectOutPath} \
-allowProvisioningUpdates

#驗(yàn)證ipa是否打包成功
if [ -e $AppStorePrijectOutPath/$Project_Name.ipa ]; then
echo '----ipa包已生成----'
open $AppStorePrijectOutPath
echo '----打包ipa完成----'
echo '**---------------**'
echo '****開始發(fā)布ipa包****'
echo '**---------------**'
#驗(yàn)證后上傳到App Store
# 將-u 后面的XXX替換成自己的AppleID的賬號(hào),-p后面的XXX替換成自己的密碼(不是登錄密碼窃判,需要生成)
altoolPath="/Applications/Xcode.app/Contents/Developer/usr/bin/altool"
#(> ${APPSTORE_PATH}/validateInfo.plist)是把返回內(nèi)容輸出到plist文件內(nèi)
xcrun "$altoolPath" --validate-app -f ${AppStorePrijectOutPath}/${Project_Name}.ipa -u xxx -p xxx -t ios --output-format xml > ${APPSTORE_PATH}/validateInfo.plist
if [ -e $AppStorePrijectOutPath/$Project_Name.ipa ]; then
#判斷是否認(rèn)證成功
successKey=$(/usr/libexec/PlistBuddy -c "Print success-message" ${APPSTORE_PATH}/validateInfo.plist)
if [ "$successKey" =  "" ]
then
echo "--validate-app認(rèn)證失敗"
else
echo "--validate-app認(rèn)證成功"
xcrun "$altoolPath" --upload-app -f ${AppStorePrijectOutPath}/${Project_Name}.ipa -u  xxx -p xxx -t ios --output-format xml
increaseVersionNumberAndBuildNumber
fi
else
echo '----ipa包導(dǎo)出失敗----'
fi
increaseVersionNumberAndBuildNumber() {
    agvtool next-version -all
    versionNum=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString"  ${Project_Name}/Info.plist)
    thirdPartVersonNum=`echo $versionNum | awk -F "." '{print $3}'`
    thirdPartVersonNum=$(($thirdPartVersonNum + 1))
    newVersionStr=`echo $versionNum | awk -F "." '{print $1 "." $2 ".'$thirdPartVersonNum'" }'`
    /usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $newVersionStr" "${Project_Name}/Info.plist"
}

這里我只全流程走了選項(xiàng)2的上傳appstroe钞楼,adhoc沒有試完。
希望對(duì)你有幫助
完袄琳!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末询件,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子唆樊,更是在濱河造成了極大的恐慌宛琅,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逗旁,死亡現(xiàn)場(chǎng)離奇詭異嘿辟,居然都是意外死亡舆瘪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門红伦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來英古,“玉大人,你說我怎么就攤上這事昙读≌俚鳎” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蛮浑,是天一觀的道長(zhǎng)唠叛。 經(jīng)常有香客問我,道長(zhǎng)沮稚,這世上最難降的妖魔是什么艺沼? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮壮虫,結(jié)果婚禮上澳厢,老公的妹妹穿的比我還像新娘。我一直安慰自己囚似,他們只是感情好剩拢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饶唤,像睡著了一般徐伐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上募狂,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天办素,我揣著相機(jī)與錄音,去河邊找鬼祸穷。 笑死性穿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雷滚。 我是一名探鬼主播需曾,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼祈远!你這毒婦竟也來了呆万?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤车份,失蹤者是張志新(化名)和其女友劉穎谋减,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扫沼,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡出爹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年庄吼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片以政。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡霸褒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盈蛮,到底是詐尸還是另有隱情废菱,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布抖誉,位于F島的核電站殊轴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏袒炉。R本人自食惡果不足惜旁理,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望我磁。 院中可真熱鬧孽文,春花似錦、人聲如沸夺艰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽郁副。三九已至减牺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間存谎,已是汗流浹背拔疚。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留既荚,地道東北人稚失。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像恰聘,于是被迫代替她去往敵國和親句各。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容