一膝宁、說明
最近需要上傳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ì)你有幫助
完袄琳!