1、前言
最近在研究上傳ipa文件自動(dòng)上傳到蘋果后臺(tái)(后續(xù)有時(shí)間也分享給大家?。?,然后,就需要制作大量的ipa文件啊!如果手工的Archive 那不就死啦,整個(gè)步驟,大概要5分鐘過程,而且不是一步到位等5分鐘,所以就研究了一下項(xiàng)目如何自動(dòng)打ipa,最后找到了 iOS項(xiàng)目之自動(dòng)化打包 - 簡書 這篇文件,然后根據(jù)需求,擴(kuò)展做了全能自動(dòng)化的,app-store、ad-hoc、dev 三種類型證書,另外項(xiàng)目如果是用cocoapod,需要用 -workspace,否則用 -project,都做了相當(dāng)自能化的改造,下面就來看看吧!
ps: fastlane 當(dāng)然能做到這些事情,但是這個(gè)工具太重,需要的配置也需要熟悉,對于剛畢業(yè)或陌生的同學(xué)有點(diǎn)難,學(xué)習(xí)一下ruby也是好事~
2、使用說明
本文,也不打算講 xcodebuild 命令的原理,大家需要自動(dòng)搜索,網(wǎng)上很多教程了。所以,我們先過一下,怎么打包吧!
-
把
build_ipa_shell腳本和證書配置文件夾復(fù)制到項(xiàng)目20180917-Shell-copy-script-to-project.png -
根據(jù)要求修改項(xiàng)目名字和配置
20180917-Shell-build-setting.png
-
在終端執(zhí)行
sh build_ipa.sh,不要求切換到項(xiàng)目的目錄啊,然后選擇打包的類型,然后等待就好!~ > sh /Users/HTC/Desktop/BuildIPAExample/build_ipa_shell/build_ipa.sh Place enter the number you want to export ? [ 1:app-store 2:ad-hoc 3:dev] -
編譯打包成功后,會(huì)自動(dòng)打開ipa文件的目錄!
20180917-Shell-build-success-ipa.png
3、配置說明
上面已經(jīng)說了 build_ipa.sh的配置,就是 ExportOptions-appstore.plist /ExportOptions-dev.plist / ExportOptions-adhoc.plist 三個(gè)證書的配置沒有說,其實(shí)也很簡單,自己配置,或者讓Xcode生成配置!
自己配置的就不說了,自己搜索一下教程就好,讓Xcode生成,就是要 Archive 項(xiàng)目,然后選擇 Export...:

上面三個(gè)文件,就對應(yīng)下面的三個(gè)選項(xiàng):

如果選擇手動(dòng),就是使用本地的證書(如果是選擇自動(dòng),就是Xcode中登陸了開發(fā)者賬號(hào),自動(dòng)生成和匹配證書):

等待Xcode生成ipa包,選擇 Export,Xcode就會(huì)自動(dòng)生成ipa文件和證書配置文件,跟我們的腳本一樣的:

最后,導(dǎo)出的文件中,更改ExportOptions.plist 文件名字為對應(yīng)的 ExportOptions-appstore.plist /ExportOptions-dev.plist / ExportOptions-adhoc.plist,然后復(fù)制到 build_ipa_shell 腳本目錄就可以啦!

4、一些坑點(diǎn)
打包時(shí),遇到下面報(bào)錯(cuò):
2018-09-17 10:35:23.068 xcodebuild[11322:5883826] [MT] IDEDistribution: Step failed: <IDEDistributionPackagingStep: 0x7ff88e7ab7c0>: Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/12/yqg0r8s508lfmzw6b91nh97m0000gn/T/ipatool-json-filepath-vo804k}
error: exportArchive: The data couldn’t be read because it isn’t in the correct format.
Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/12/yqg0r8s508lfmzw6b91nh97m0000gn/T/ipatool-json-filepath-vo804k}
** EXPORT FAILED **
解決方法:
將對應(yīng)打包的證書plist文件的compileBitcode內(nèi)容由 true 改為 false 就可以:
<key>compileBitcode</key>
<false/>
5、源代碼
具體的代碼,也可參考我的Github代碼:
#獲取腳本執(zhí)行目錄
scrip_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
#工程絕對路徑
project_path=$(dirname "$scrip_path")
#工程名 將XXX替換成自己的工程名
project_name=BuildIPAExample
#scheme名 將XXX替換成自己的sheme名
scheme_name=BuildIPAExample
#project_type 項(xiàng)目如果是用cocoapod,就改為 xcworkspace,否則用 xcodeproj
project_type=xcodeproj
#打包模式 Debug/Release
development_mode=Debug
#build文件夾路徑
build_path=${project_path}/build
#plist文件所在路徑
exportOptionsPlistPath=${project_path}/build_ipa_shell/ExportOptions-dev.plist
echo "Place enter the number you want to export ? [ 1:app-store 2:ad-hoc 3:dev] "
read number
while([[ $number != 1 ]] && [[ $number != 2 ]] && [[ $number != 3 ]])
do
echo "Error! Should enter 1 or 2 or 3"
echo "Place enter the number you want to export ? [ 1:app-store 2:ad-hoc 3:dev] "
read number
done
if [ $number == 1 ];then
development_mode=Release
exportOptionsPlistPath=${project_path}/build_ipa_shell/ExportOptions-appstore.plist
elif [ $number == 2 ];then
development_mode=Release
exportOptionsPlistPath=${project_path}/build_ipa_shell/ExportOptions-adhoc.plist
else
development_mode=Debug
exportOptionsPlistPath=${project_path}/build_ipa_shell/ExportOptions-dev.plist
fi
#導(dǎo)出.ipa文件所在路徑
exportIpaPath=${project_path}/ipa_files/${development_mode}
# 生成保存ipa文件的目錄
if [ ! -d ${project_path}/ipa_files ];
then
mkdir -p ${project_path}/ipa_files;
fi
# 打包類型
if [ $project_type == "xcodeproj" ];
then
project_build=project
else
project_build=workspace
fi
# 進(jìn)入項(xiàng)目目錄,方便后面的操作
cd ${project_path}
echo '///-----------'
echo '/// 正在清理工程'
echo '///-----------'
xcodebuild \
clean -configuration ${development_mode} -quiet || exit
echo '///--------'
echo '/// 清理完成'
echo '///--------'
echo ''
echo '///-----------'
echo '/// 正在編譯工程:'${development_mode}
echo '///-----------'
xcodebuild \
archive -${project_build} ${project_path}/${project_name}.${project_type} \
-scheme ${scheme_name} \
-configuration ${development_mode} \
-archivePath ${build_path}/${project_name}.xcarchive -quiet || exit
echo '///--------'
echo '/// 編譯完成'
echo '///--------'
echo ''
echo '///----------'
echo '/// 開始ipa打包'
echo '///----------'
xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive \
-configuration ${development_mode} \
-exportPath ${exportIpaPath} \
-exportOptionsPlist ${exportOptionsPlistPath} \
-quiet || exit
if [ -e $exportIpaPath/$scheme_name.ipa ]; then
echo '///----------'
echo '/// ipa包已導(dǎo)出'
echo '///----------'
open $exportIpaPath
else
echo '///-------------'
echo '/// ipa包導(dǎo)出失敗 '
echo '///-------------'
fi
echo '///------------'
echo '/// 打包ipa完成 '
echo '///-----------='
echo ''
# 打開生成ipa的目錄
open ${exportIpaPath}
# echo '///-------------'
# echo '/// 開始發(fā)布ipa包 '
# echo '///-------------'
# if [ $number == 1 ];then
# #驗(yàn)證并上傳到App Store
# # 將-u 后面的XXX替換成自己的AppleID的賬號(hào),-p后面的XXX替換成自己的密碼
# 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 XXX -p XXX -t ios --output-format xml
# "$altoolPath" --upload-app -f ${exportIpaPath}/${scheme_name}.ipa -u XXX -p XXX -t ios --output-format xml
# else
# #上傳到Fir
# # 將XXX替換成自己的Fir平臺(tái)的token
# fir login -T XXX
# fir publish $exportIpaPath/$scheme_name.ipa
# fi
exit 0
6、總結(jié)
通過本次腳本,又讓效率提升了n倍,以后打包不在害怕啦?。?!另外,腳本中,還包含 上傳到 AppStore 或第三方平臺(tái)的功能,這里就先不寫啦,大家有興趣可以自行實(shí)踐,和前面幾篇技巧一樣,大家應(yīng)該能感受到shell腳本編程的魅力,希望大家能舉一反三,授魚不如授漁!生活工作中結(jié)合 sehll 腳本,提高效率和自動(dòng)化,珍愛時(shí)間不是夢!
后續(xù)有更多技巧,會(huì)繼續(xù)給大家分享,期待~
參考
- iOS項(xiàng)目之自動(dòng)化打包 - 簡書
- Xcode9 iOS export archive fails on correct format |Apple Developer Forums
- iHTCboy/iShell: Shell腳本編程技巧,總結(jié)一些常用的提高效率的方法。
- iHTCboy/BuildIPAExample: Build IPA file Example
- 如有疑問,歡迎在評(píng)論區(qū)一起討論!
- 如有不正確的地方,歡迎指導(dǎo)!
注:本文首發(fā)于 iHTCboy's blog,如若轉(zhuǎn)載,請注來源


