xcode 选择configuraftions 打包_分利宝IOS自动化打包
前言
在iOS開發(fā)中,我們常用的打包上傳方式就是用Xcode的archive方式打包。到了測試階段,需要頻繁的打包提交到測試平臺,整個流程包括:編譯-打包-上傳,整個過程需要我們?nèi)?jiān)守每一步操作,提交app store同樣免不了一系列復(fù)雜動手操作過程。
對此,我們研究了iOS自動化打包,通過使用shell腳本,輸入命令,一鍵打包上傳,提高工作效率。
在了解自動化打包之前,我們先看下我們傳統(tǒng)的打包方式:
第一種打包方式:傳統(tǒng)打包方式(archive方式)
就是我們的傳統(tǒng)打包方式——利用Xcode進(jìn)行archive(歸檔)操作,通過編譯、build構(gòu)建、Archive存檔、Export導(dǎo)出ipa。
打包前準(zhǔn)備工作: 設(shè)置好對應(yīng)版本號,證書正確配置,或使用自動管理證書,然后選擇通用設(shè)備; 開始進(jìn)行achive歸檔打包:點(diǎn)擊左上角product——>achive:如下圖:
通過編譯歸檔之后生成archive文件,再點(diǎn)擊右側(cè)的distribute App,如下圖:
然后選擇打包環(huán)境,如下圖,第1種: 生產(chǎn)環(huán)境,上傳到appStore的;第2種: 測試環(huán)境的上傳到蒲公英或fir上的;第3種:用于企業(yè)賬號發(fā)布;第4種: 開發(fā)調(diào)試用的,debug模式會輸出日志信息。開發(fā)測試一般用第2種或第4種。
按提示點(diǎn)擊next下一步操作,最后export導(dǎo)出來,會生成一個文件夾,里面裝了ipa包,就是我們需要上傳ipa包。通過xcode自帶的插件工具Application Locader(通過右擊Xcode圖標(biāo)選擇Open Developer Tool)選擇ipa包上傳就行了。
第二種打包方式:也可以通過生成文件Payload文件夾,生成ipa包
操作步驟:
打包前準(zhǔn)備:同樣要相關(guān)證書的配置,編譯能通過不報(bào)錯。 選擇要編譯的Shcheme,然后command+B編譯成功,在products文件夾里可以看到由之前的紅色變成了黑色如下圖:上圖(編譯前),下圖(編譯后)
右鍵編譯后的Projudct,show in Finder里面找到這個app如下圖:
在桌面建一個文件夾叫“Payload”,注意一個字母也不能改,然后把這個app放入這個文件夾里,壓縮成zip,再修改后綴為.ipa。上傳操作同第一種方式一樣。
自動化打包上傳
打包原理:
主要是通過shell腳本實(shí)現(xiàn)archive->生成ipa->上傳到第三方平臺(Fir.im 、蒲公英)或 App store這一系列過程的自動化。
準(zhǔn)備工作:安裝fir-cli插件
打開終端輸入sudo gem install fir-cli,如下圖,這里輸入命令安裝的時候要注意下權(quán)限問題。
// 安裝指令
gem sudo install fir-cli
對于沒有安裝過rvm的,需要安裝rvm(一個命令行工具,可以提供一個便捷的多版本 Ruby 環(huán)境的管理和切換)
安裝rvm,網(wǎng)上有大把的教程。
相關(guān)環(huán)境配置、shell腳本編寫
根據(jù)需求,我這里做了3種環(huán)境配置,appStore、ad-hoc、development三種環(huán)境plist文件添加和設(shè)置,如下圖
用xcode創(chuàng)建這三份plist文件放在當(dāng)前工程目錄里。這里制作了一份通用shell腳本(以fir和appStore為例):
#先清理目錄(由于歷史編譯存留的文件)
if [ -d ./ipaDir ];
then
rm -rf ./ipaDir
fi
if [ -d ./build ];
then
rm -rf ./build
fi
#ipa包存放路徑
if [ ! -d ./ipaDir ];
then
mkdir -p ipaDir;
fi
#腳本執(zhí)行目錄/工程絕對路徑
project_path=$(cd `dirname $0`; pwd)
#工程名 將XXX替換成自己的工程名
project_name=XXX
#scheme名 將XXX替換成自己的sheme名
scheme_name=XXX
#打包模式 Debug/Release
development_mode=Debug
#build文件夾路徑
build_path=${project_path}/build
#plist文件所在路徑
exportOptionsPlistPath=${project_path}/exportTest.plist
#導(dǎo)出.ipa文件所在路徑
exportIpaPath=${project_path}/ipaDir/${development_mode}
#輸入1:appStore(發(fā)布) ?2:ad-hoc(開發(fā)-測試) 3:dev(開發(fā)-測試)
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
#appStore
if [ $number == 1 ];then
development_mode=Release
exportOptionsPlistPath=${project_path}/exportAppstore.plist
exportIpaPath=${project_path}/ipaDir/${development_mode}
#ad-hoc
elif [ $number == 2 ];then
development_mode=Release
exportOptionsPlistPath=${project_path}/exportTest.plist
#dev
else
scheme_name=fenlibao_iphone_DEV
development_mode=Debug
exportOptionsPlistPath=${project_path}/exportTest_DEV.plist
fi
echo '/// 正在編譯工程:'${development_mode}
echo '///-----------'
#如果工程不是.xcworkspace類型而是.xcodeproj類型,則下面的.xcworkspace換成.xcodeproj
xcodebuild \
archive -workspace ${project_path}/${project_name}.xcworkspace \
-scheme ${scheme_name} \
-configuration ${development_mode} \
-archivePath ${build_path}/${project_name}.xcarchive ?-quiet ?|| exit
echo '///--------'
echo '/// 打包中...'
echo '///--------'
xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive \
-configuration ${development_mode} \
-exportPath ${exportIpaPath} \
-exportOptionsPlist ${exportOptionsPlistPath} \
-quiet || exit
echo '///-------------'
echo '/// 開始上傳ipa包 '
echo '///-------------'
if [ $number == 1 ];then
#驗(yàn)證并上傳到App Store
# 將-u 后面的XXX替換成自己的AppleID的賬號,-p后面的XXX替換成自己的密碼(注:如果已開啟雙重認(rèn)證,則密碼為專用密碼,專用密碼要在開啟雙重認(rèn)證后才能開啟)
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平臺的token
fir login -T XXX
fir publish $exportIpaPath/$scheme_name.ipa
fi
exit 0
把shell腳本和三個plist配置文件放在工程目錄下,將shell腳本做相應(yīng)修改:
換成自己項(xiàng)目的工程名和scheme名稱
#工程名 將XXX替換成自己的工程名
project_name=XXX
#scheme名 將XXX替換成自己的sheme名
scheme_name=XXX
下面代碼是在上傳appStore的時候需要知道appleID 和密碼
#驗(yàn)證并上傳到App Store
# 將-u 后面的XXX替換成自己的AppleID的賬號,-p后面的XXX替換成自己的密碼(注:如果已開啟雙重認(rèn)證,則密碼為專用密碼,專用密碼要在開啟雙重認(rèn)證后才能開啟)
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
這里要注意的一點(diǎn)就是對于開啟了雙重認(rèn)證的賬號,密碼不是賬號登錄密碼,而是app專用密碼,app專用密碼是要在開啟雙重認(rèn)證之后,需要自己去開發(fā)者網(wǎng)站的用戶信息設(shè)置里去生成。
在上傳fir內(nèi)測平臺的時候要自己fir平臺的token,進(jìn)入fir我的應(yīng)用去獲取token,獲取方式如下圖:
以上就完成了自動化的所有配置。1個shell腳本,3個plist文件對應(yīng)三種打包環(huán)境,文件位置如下:
開啟一鍵打包上傳
接下來就是一行命令執(zhí)行自動化打包上傳:
打開終端,cd到要打包的工程目錄下,輸入"./shell.sh" 回車,如下
這里會讓你選擇之前配置的3種環(huán)境中的一種環(huán)境,只能輸入1、2、3,如果輸入其他的數(shù)字會無效,讓你重新輸入,輸入之后回車就開始執(zhí)行自動化打包上傳操作了,上傳成功顯示如下:
自動化打包注意事項(xiàng)
打包之前,確保證書配置正確,配置plist文件里面的compileBitcode設(shè)置為false,否則會打包報(bào)錯;
fir-cli安裝時由于系統(tǒng)版本原因會提示各種權(quán)限不足,解決方式: sudo gem install-n/usr/local/bin fir-cli;
根據(jù)工程類型是.xcodeproj類型還是.workspace,腳本編譯代碼改成相應(yīng)的工程類型;
打包到appStore的時候,對于開啟雙重認(rèn)證的開發(fā)者賬號,密碼必須為賬戶的app專用密碼,而不是開發(fā)者賬號的登錄密碼。
總結(jié)
傳統(tǒng)的打包方式耗費(fèi)了我們開發(fā)者更多的時間和體力,而且效率低下,出錯率也要偏高;利用shell腳本自動化打包,降低了人工操作成本,加快了工作效率。
- END -
更多推薦內(nèi)容
《分利寶微服務(wù)實(shí)踐》
《看看前端自動化構(gòu)建,我們是這樣做的》
《Pytest進(jìn)行UI自動化測試實(shí)用操作》
《每個Android開發(fā)都必須知道的利器》
《kubernetes 單master集群的搭建》
總結(jié)
以上是生活随笔為你收集整理的xcode 选择configuraftions 打包_分利宝IOS自动化打包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql是自动表锁定吗_MySQL数据
- 下一篇: dz mysql日志清理_Discuz教