xcodebuild 自動化打包


altool 文檔

 

 使用xcode自帶的xcodebuild 命令通過腳本進行打包

打包->導出ipa, 兩行關鍵的腳本代碼

1.Archive

xcodebuild archive 
           -archivePath <archivePath>
           -project <projectName>
           -workspace <workspaceName>
           -scheme <schemeName>    #從-list命令中獲取
           -configuration <Debug|Release>

2.Export

xcodebuild -exportArchive
           -archivePath <xcarchivepath>
           -exportPath <destinationpath>
           -exportOptionsPlist <plistpath>   #這個plist文件可以通過打一次ipa包里面去獲取

3.upload

altool 是xcode自帶的Application Loader 的命令行,可以完成提交到App Store 

 

if [[ $number == 1 ]]; then

    echo "///--------------------"
    echo "/// 開始發布到 app store"
    echo "///--------------------"

    altoolPath=/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Support/altool
    "$altoolPath" --validate-app -f $export_ipa_path/$project_scheme.ipa\
                  -u <你的開發者賬號> -p <你的開發者賬號密碼>\
                  --output-format xml
    "$altoolPath" --upload-app -f $export_ipa_path/$project_scheme.ipa\
                  -u <你的開發者賬號> -p <你的開發者賬號密碼>\
                  --output-format xml
else

    echo "///--------------------"
    echo "/// 開始上傳ipa包到蒲公英"
    echo "///--------------------"
    curl -F "file=@$export_ipa_path/$project_scheme.ipa"\
         -F "uKey=<你的蒲公英uKey>"\
         -F "_api_key=<你的蒲公英ApiKey>" https://qiniu-storage.pgyer.com/apiv1/app/upload
fi

 

參考:

xcodebuild命令介紹

iOS自動化打包 ---- 集成shell腳本

Xcodebuild自動打包總結

詳解Shell腳本實現iOS自動化編譯打包提交

iOS-如何實現每次打包編譯號自動增加

https://github.com/monetking/AutoPacking-iOS 

shell 腳本

#!/bin/sh

#  WallPaperScript.sh

#計時
SECONDS=0

#取當前時間字符串添加到文件結尾
now=$(date +"%Y%m%d-%H:%M")

# 獲取 setting.plist 文件路徑
setting_path=./setting.plist

# 項目名稱
project_name=$(/usr/libexec/PlistBuddy -c "print project_name" ${setting_path})

# 項目路徑
project_path=$(/usr/libexec/PlistBuddy -c "print project_path" ${setting_path})

# workspace/xcodeproj 路徑(根據項目是否使用cocoapod,確定打包的方式)
if [ -d "./${project_name}.xcworkspace" ];then # 項目中存在workspace
workspace_path="${project_path}/${project_name}.xcworkspace"
else # 項目中不存在 workspace
workspace_path="${project_path}/${project_name}.xcodeproj"
fi

# scheme名稱
scheme_name=$(/usr/libexec/PlistBuddy -c "print scheme_name" ${setting_path})

# 項目版本
project_version=$(/usr/libexec/PlistBuddy -c "print project_version" ${setting_path})

# 開發者賬號
dev_account=$(/usr/libexec/PlistBuddy -c "print dev_account" ${setting_path})

# 開發者密碼
dev_password=$(/usr/libexec/PlistBuddy -c "print dev_password" ${setting_path})

# 配置打包樣式:Release/ad-hoc/Debug
configuration=$(/usr/libexec/PlistBuddy -c "print configuration" ${setting_path})

# 發布地址:蒲公英->PGY,蘋果->APPStore, fir.im->FI
upload_address=$(/usr/libexec/PlistBuddy -c "print upload_address" ${setting_path})

# ipa包名稱:項目名+版本號+打包類型
ipa_name=$(/usr/libexec/PlistBuddy -c "print ipa_name" ${setting_path})

# ipa包路徑
ipa_path2=$(/usr/libexec/PlistBuddy -c "print ipa_path" ${setting_path})/${now}
ipa_path="${ipa_path2}-V${project_version}-${upload_address}"

# 打包配置plist文件路徑 (初始化)
plist_path=$(/usr/libexec/PlistBuddy -c "print plist_path" ${setting_path})

# 編譯build路徑
archive_path="${ipa_path}/${project_name}.xcarchive"

# 上傳到蒲公英設置
user_key=$(/usr/libexec/PlistBuddy -c "print user_key" ${setting_path})
api_key=$(/usr/libexec/PlistBuddy -c "print api_key" ${setting_path})
password=$(/usr/libexec/PlistBuddy -c "print password" ${setting_path})

# 上傳fir.im 設置
fir_token=$(/usr/libexec/PlistBuddy -c "print fir_token" ${setting_path})

#打包方式配置,以及相應的需求配置
if [ ${upload_address} == "APPStore" ];then # 發布到 AppStore 配置 Release
    configuration="Release"
    plist_path=${project_path}/exportAppstore.plist
elif [ ${upload_address} == "PGY" ] ||[ ${upload_address} == "FI" ];then # 發布到第三方平台可 配置 Release、Debug
    if [ ${configuration} == "Release" ];then
     plist_path=${project_path}/exportAdHoc.plist
    else
     plist_path=${project_path}/exportDevelopment.plist
    fi
else # 只打包,不發布到任何平台
    if [ ${configuration} == "Release" ];then
       plist_path=${project_path}/exportAppstore.plist
    else
       plist_path=${project_path}/exportDevelopment.plist
    fi
fi

echo '=============正在清理工程============='
xcodebuild clean -configuration ${configuration} -quiet || exit

echo '清理完成-->>>--正在編譯工程:'${configuration}

# 通過workspace方式打包
if [ -d "./${project_name}.xcworkspace" ];then # 項目中存在workspace
    xcodebuild archive -workspace ${workspace_path} -scheme ${scheme_name} \
    -configuration ${configuration} \
    -archivePath ${archive_path} -quiet || exit
else #通過xcodeproj 方式打包
    xcodebuild archive -project ${workspace_path} -scheme ${scheme_name} \
    -configuration ${configuration} \
    -archivePath ${archive_path} -quiet || exit
fi

# 檢查是否構建成功(build)
if [ -d "$archive_path" ] ; then
    echo '=============項目構建成功============='
else
    echo '=============項目構建失敗============='
    exit 1
fi

echo '編譯完成-->>>--開始ipa打包'
xcodebuild -exportArchive -archivePath ${archive_path} \
-configuration ${configuration} \
-exportPath ${ipa_path} \
-exportOptionsPlist ${plist_path} \
-quiet || exit

if [ -e ${ipa_path}/${ipa_name}.ipa ]; then
    echo '=============ipa包導出成功============='
    open $ipa_path
else
    echo '=============ipa包導出失敗============'
fi

echo '打包ipa完成-->>>--開始發布ipa包'

if [ ${upload_address} == "APPStore" ];then # 發布到APPStore
    echo '發布ipa包到 =============APPStore============='
    altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"
    "$altoolPath" --validate-app -f ${ipa_path}/${ipa_name}.ipa -u ${dev_account} -p ${dev_password} -t ios --output-format xml
    "$altoolPath" --upload-app -f ${ipa_path}/${ipa_name}.ipa -u ${dev_account} -p ${dev_password} -t ios --output-format xml

    if [ $? = 0 ];then
    echo "=============提交AppStore成功 ============="
    else
    echo "=============提交AppStore失敗 ============="
    fi

elif [ ${upload_address} == "PGY" ];then # 發布到蒲公英平台
    echo '發布ipa包到 =============蒲公英平台============='
    curl -F "file=@${ipa_path}/${ipa_name}.ipa" -F "uKey=${user_key}" -F "_api_key=${api_key}" -F "password=${password}" https://www.pgyer.com/apiv1/app/upload

    if [ $? = 0 ];then
    echo "=============提交蒲公英成功 ============="
    else
    echo "=============提交蒲公英失敗 ============="
    fi

elif [ ${upload_address} == "FI" ];then # 發布到fir.im 平台
    echo '發布ipa包到 =============fir.im平台============'
    # 需要先在本地安裝 fir 插件,安裝fir插件命令: gem install fir-cli
    fir login -T ${fir_token}              # fir.im token
    fir publish  ${ipa_path}/${ipa_name}.ipa

    if [ $? = 0 ];then
    echo "=============提交fir.im成功 ============="
    else
    echo "=============提交fir.im失敗 ============="
    fi
else # 未配置發布地址
    echo "=============未發布 ipa包(打包方式:$configuration) 到任何平台============="
fi

# 輸出總用時
echo "執行耗時: ${SECONDS}秒"

exit 0

 

me測試項目

#!/bin/sh
#計時
SECONDS=0
# 項目名稱
project_name='AudioVideo'
# 項目路徑
project_path='/Users/xueshan1/Desktop/AudioVideo/AudioVideo'

# workspace/xcodeproj 路徑(根據項目是否使用cocoapod,確定打包的方式)
if [ -e "${project_path}/${project_name}.xcworkspace" ];then
workspace_path="${project_path}/${project_name}.xcworkspace"
else
workspace_path="${project_path}/${project_name}.xcodeproj"
fi

# scheme名稱
scheme_name='AudioVideo'
# 項目版本
project_version='1.2'
# 開發者賬號
dev_account=''
# 開發者密碼
dev_password=''

 api_key=''
 issuer_id=''

# 配置打包樣式:Release/ad-hoc/Debug
configuration='Release'
# 發布地址:蒲公英->PGY,蘋果->APPStore, fir.im->FI
upload_address='APPStore'
# upload_address='PGY'
# 編譯build路徑
archive_path="/Users/xueshan1/Desktop/AudioVideo打包/Test.xcarchive"
# ipa包名稱:項目名+版本號+打包類型
ipa_name='AudioVideo'
# ipa包路徑
ipa_path2='/Users/xueshan1/Desktop/AudioVideo打包/ipa'
ipa_path="${ipa_path2}-V${project_version}-${upload_address}"
ipa_pathIPA=${ipa_path}/${ipa_name}.ipa 

# 打包配置plist文件路徑
plist_path='/Users/xueshan1/Desktop/AudioVideo/AudioVideo/exportAppstore.plist'



#打包方式配置,以及相應的需求配置
if [ ${upload_address} == "APPStore" ];then
    configuration="Release"
    plist_path=${project_path}/exportAppstore.plist
else
#    if [ ${configuration} == "Release" ];then
#       plist_path=${project_path}/exportAppstore.plist
#    else
       plist_path=${project_path}/exportDevelopment.plist
#    fi
fi

echo '=============正在清理工程============='
echo $configuration

xcodebuild \
clean -workspace ${project_path}/${project_name}.xcworkspace \
-scheme ${scheme_name} \
-configuration ${configuration} -quiet  || exit

echo '清理完成-->>>--正在編譯工程:'${workspace_path}
# build
if [ -d ${workspace_path} ];then
    xcodebuild archive -workspace ${workspace_path} \
    -scheme ${scheme_name} \
    -configuration ${configuration} \
    -archivePath ${archive_path} -quiet || exit
else
    echo 'workspace 不存在'
fi

# 檢查是否構建成功(build)
if [ -d ${archive_path} ] ; then
    echo '=============項目 build 成功============='
else
    echo '=============項目 build 失敗============='
    exit 1
fi

# exprot
echo '編譯完成-->>>--開始ipa打包'
xcodebuild -exportArchive -archivePath ${archive_path} \
-configuration ${configuration} \
-exportPath ${ipa_path} \
-exportOptionsPlist ${plist_path} \
-quiet || exit

if [ -e ${ipa_pathIPA} ]; then
    echo '=============ipa包導出成功============='
    open $ipa_path
else
    echo '=============ipa包導出失敗============'
    echo "${ipa_pathIPA}"
    exit 1
fi

echo "-->>>--開始發布ipa包  ${ipa_pathIPA}"

if [ ${upload_address} == "APPStore" ];then # 發布到APPStore
    echo '發布ipa包到 =============APPStore============='

    altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"
    # "$altoolPath" --validate-app -f ${ipa_pathIPA} -u ${dev_account} -p ${dev_password} -t ios --output-format xml
    # "$altoolPath" --upload-app -f ${ipa_pathIPA} -u ${dev_account} -p ${dev_password} -t ios --output-format xml

  #新命令, 使用api_key xcrun altool
--validate-app -f ${ipa_pathIPA} -u ${dev_account} -p ${dev_password} -t ios --output-format xml  --apiKey ${api_key} --apiIssuer ${issuer_id} xcrun altool --upload-app -f ${ipa_pathIPA} -u ${dev_account} -p ${dev_password} -t ios --output-format xml  --apiKey ${api_key} --apiIssuer ${issuer_id}   if [ $? = 0 ];then echo "=============提交AppStore成功 =============" else echo "=============提交AppStore失敗 =============" fi else # 蒲公英 echo '發布ipa包到 =============蒲公英=============' curl -F "file=@${ipa_pathIPA}" -F "_api_key=eb4171585a2f2df5674db48745520bc0" -F "password=maxueshan123" -F "buildInstallType=2" -F "buildPassword=2" https://www.pgyer.com/apiv2/app/upload if [ $? = 0 ];then echo "=============提交蒲公英成功 =============" else echo "=============提交蒲公英失敗 =============" fi fi # 輸出總用時 echo "執行耗時: ${SECONDS}秒" exit 0

 

上傳驗證ipa包時候報錯,  將開發者賬號密碼替換成 秘鑰的方式

 參考1 

 參考2 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM