一、說明
最近需要上傳appstroe,每次長傳都要等待很久,于是就在網(wǎng)上找自動上傳的資料,方法有好幾種Jenkins、fastlane,應(yīng)為只是簡單的上傳appstroe,最后選擇了使用xcodebuild。
參考文章找了很久沒找到,如有看到提醒我加上。
使用前需要安裝安裝xcodebuild
二、步驟簡單介紹(最后代碼中已有注釋)
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包,自動證書需要加上-allowProvisioningUpdates
xcodebuild -exportArchive \ -archivePath ${APPSTORE_PATH}/${Project_Name}-appstore.xcarchive -exportOptionsPlist ${AppStoreExportOptionsPlist} -exportPath ${AppStorePrijectOutPath} -allowProvisioningUpdates
4.使用altool驗證和上傳ipa包
初步驗證ipa包,這里我需要驗證包是否初步驗證成功需要,將驗證結(jié)果導(dǎo)出到plist中> ${APPSTORE_PATH}/validateInfo.plist,如果驗證成功會有一個成功的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中版本號自增,用到agvtool
5.1.agvtool next-version -all就能自動增加build號了,但是是整數(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è)置版本號
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $newVersionStr" "${Project_Name}/Info.plist"
三、使用步驟
1.在.xcodeproj文件夾下創(chuàng)建shell.sh文件、ExportOptions.plist文件,ExportOptions.plist可以自己先手動打包一次,就會有生產(chǎn)這個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的名字,如果沒有則不需要這段話,我測試工程不是一個工作空間所以就沒用,如果需要用的話,還需要在編譯階段的腳本代碼里加上 -workspace ${Project_Name}.xcworkspace
Workspace_Name="項目bundle identifier"
#工程名字
Project_Name="項目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ù)輸入的序號不同,打包成不同版本的ipa
echo "~~~~~~~~~~~~選擇打包方式(輸入序號)~~~~~~~~~~~~~~~"
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)容刪掉,加入了證書和描述文件,如果不需要請刪除
#如果用戶選擇的是1,就執(zhí)行adhoc腳本
rm -rf ${BUILD_PATH}
#創(chuàng)建文件夾,路徑需要一層一層創(chuàng)建,不然會創(chuàng)建失敗
mkdir ${BUILD_PATH}
mkdir ${ADHOC_PATH}
#編譯文件
mkdir ${CONFIGURATION_BUILD_PATH_ADHOC}
#打包輸出的文件
mkdir ${AdHocPrijectOutPath}
#copy
mkdir ${DSYM_COPY_PATH_ADHOC}
#編譯
#自動證書配置需要加上這個-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)建,不然會創(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
#自動證書配置需要加上這個-allowProvisioningUpdates
xcodebuild -exportArchive \
-archivePath ${APPSTORE_PATH}/${Project_Name}-appstore.xcarchive \
-exportOptionsPlist ${AppStoreExportOptionsPlist} \
-exportPath ${AppStorePrijectOutPath} \
-allowProvisioningUpdates
#驗證ipa是否打包成功
if [ -e $AppStorePrijectOutPath/$Project_Name.ipa ]; then
echo '----ipa包已生成----'
open $AppStorePrijectOutPath
echo '----打包ipa完成----'
echo '**---------------**'
echo '****開始發(fā)布ipa包****'
echo '**---------------**'
#驗證后上傳到App Store
# 將-u 后面的XXX替換成自己的AppleID的賬號,-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"
}
這里我只全流程走了選項2的上傳appstroe,adhoc沒有試完。
希望對你有幫助
完!