特別說(shuō)明:如果項(xiàng)目沒(méi)有采用Cocoapods管理,沒(méi)有.xcworkspace,只有xcodeproj;只需要將腳本中這句
xcodebuild \
archive -workspace ${project_path}/${project_name}.xcworkspace \
這句替換成下面這樣就ok了
xcodebuild \
archive -project ${project_path}/${project_name}.xcodeproj \
日常編譯打包工作主要是以下兩個(gè)目的:
- 提交測(cè)試版本ipa給測(cè)試人員
配置好測(cè)試描述文件先较,然后Product -> Archive
編譯打包,選擇Organizer
,導(dǎo)出ad hoc 的 ipa
包陈辱。再上傳到Fir等第三方平臺(tái)上,然后通知測(cè)試同事進(jìn)行測(cè)試顾犹。整個(gè)流程下來(lái)需要人工監(jiān)守操作比較耗費(fèi)時(shí)間。 - 提交ipa包到App Store已供審核
配置好正式的描述文件褒墨,然后同樣的方式打包導(dǎo)出app store 的 ipa
包炫刷。通過(guò)Application Loader 等方式
提交到App store等待蘋果處理二進(jìn)制包,處理完后選擇構(gòu)建版本郁妈,最后提交等待蘋果審核柬唯。
無(wú)論打測(cè)試包提供測(cè)試人員測(cè)試還是打正式包上傳到App strore,整個(gè)過(guò)程都是重復(fù)耗費(fèi)人工的操作圃庭,需要人工等待锄奢,然后各種點(diǎn)擊選擇...我們可以通過(guò)編寫腳本語(yǔ)言來(lái)實(shí)現(xiàn)整個(gè)過(guò)程。
配置自動(dòng)打包發(fā)布的流程
通過(guò)下面幾步的設(shè)置好之后剧腻,以后再進(jìn)行打包發(fā)布到第三方平臺(tái)或者App Store 只需要一步就能搞定了(一個(gè)回車搞定)
筆者通過(guò)shell腳本
實(shí)現(xiàn)從archive->生成ipa->上傳到第三方平臺(tái)(Fir.im 拘央、蒲公英)或 App store
。通過(guò)下面幾步即可實(shí)現(xiàn)自動(dòng)打包上傳功能书在。
- 下載Shell腳本
- 將archiveScript中的幾文件拖入工程的根目錄
- 根據(jù)自己需求選擇好描述文件
- 根據(jù)自己的項(xiàng)目修改一下shell.sh (修改哪里下面會(huì)指出)
- cd到工程根目錄灰伟,通過(guò)./shell.sh 執(zhí)行腳本即可
下面通過(guò)實(shí)例詳細(xì)演示整個(gè)過(guò)程
第一種:打包上傳到第三方平臺(tái)Fir (上傳蒲公英原理一樣)
第二種:打包上傳到App store
將通過(guò)這幾步來(lái)講解整個(gè)過(guò)程
- 準(zhǔn)備工作
- 準(zhǔn)備工作做完后,正式開(kāi)啟自動(dòng)化之路
- 自動(dòng)化腳本執(zhí)行過(guò)程中可能遇到的錯(cuò)誤
準(zhǔn)備工作
-
因?yàn)橐蟼鞯紽ir平臺(tái)儒旬,需要先安裝fir-cli
-
如果沒(méi)有安裝過(guò)rvm栏账,需要安裝rvm,在終端輸入
rvm -v
命令查看,如果打印出rvm:command not found
說(shuō)明沒(méi)有安裝過(guò)rvm栈源,如果能打印出rvm版本等信息說(shuō)明安裝過(guò)挡爵。如果沒(méi)有安裝過(guò)rvm可以通過(guò)下面的命安裝,如果已經(jīng)安裝過(guò)可以忽略甚垦。- 在終端輸入
curl -L get.rvm.io | bash -s stable
,然后稍等一會(huì)rvm就安裝好了 - 在終端輸入
source ~/.bashrc
- 在終端輸入
source ~/.bash_profile
- 再輸入
rvm -v
查看安裝成功
- 在終端輸入
準(zhǔn)備工作做完后茶鹃,正式開(kāi)啟自動(dòng)化之路
一、將archiveScript中的3個(gè)文件拖入工程的根目錄
二艰亮、根據(jù)自己需求選擇好描述文件
三闭翩、修改一下shell.sh 文件
Product ->Scheme -> Edit Scheme 查看自己的scheme_name
獲取Fir平臺(tái)的token
三、 cd到工程根目錄迄埃,./shell.sh 回車就會(huì)執(zhí)行腳本
四疗韵、 根據(jù)自己的需求選擇即可
如果開(kāi)始選擇的1:app-store 會(huì)發(fā)布到app store
如果開(kāi)始選擇的2:ad-hoc 發(fā)布到fir平臺(tái)
如果遇到下面的錯(cuò)誤
解決方法:在終端 輸入rvm system
后重新執(zhí)行sehll腳本就可以了
如果前面已經(jīng)安裝過(guò)fir-cli,但是在腳本執(zhí)行過(guò)程中任然報(bào)fir:command not found
的錯(cuò)誤
解決辦法: 在終端輸入rvm get head
執(zhí)行完畢后再次執(zhí)行腳本就ok了
到這里就已經(jīng)實(shí)現(xiàn)了通過(guò)腳本打包并發(fā)布到第三方平臺(tái)Fir 和 Appstore的整個(gè)流程侄非。接下來(lái)對(duì)shell中的腳本和一些自動(dòng)化原理進(jìn)行簡(jiǎn)單說(shuō)明
shell中的腳本和一些自動(dòng)化原理
正常情況下手動(dòng)在Xcode中執(zhí)行Product -> Archive
, 在Xcode底層是通過(guò)xcodebuild相關(guān)的命令編譯蕉汪、打包生成ipa包的.(xcodebuild主要是用來(lái)編譯流译,打包成Archive和導(dǎo)出ipa包)
進(jìn)入終端可以通過(guò)下面的命令查看一下xcodebuild的version
接下來(lái),看一下Shell腳本
上面內(nèi)容注釋大家一看應(yīng)該就明白
清理構(gòu)建目錄
xcodebuild \
clean -configuration ${development_mode}
編譯之前先clean下肤无,就如同在Xcode進(jìn)行Product -> Clean
先蒋。
編譯打包成Archive
xcodebuild \
archive -workspace ${project_path}/${project_name}.xcworkspace \
-scheme ${scheme_name} \
-configuration ${development_mode} \
-archivePath ${build_path}/${project_name}.xcarchive
編譯工程骇钦,編譯并生成.xcarchive文件宛渐,放在build_path下,名字是project_name.xcarchive眯搭,就如在Xcode進(jìn)行Product -> Archive
這一步最為耗時(shí).
將Archive導(dǎo)出ipa
xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive \
-configuration ${development_mode} \
-exportPath ${exportIpaPath} \
-exportOptionsPlist ${exportOptionsPlistPath}
將生成的.xcarchive文件導(dǎo)出.ipa包到指定的exportIpaPath路徑下窥翩。
說(shuō)明:
用\來(lái)進(jìn)行換行分隔,一條shell命令過(guò)長(zhǎng)時(shí)可以進(jìn)行分割顯示.
$變量名是引用變量鳞仙,拿來(lái)使用
|| exit 指明如果這一條命令執(zhí)行失敗寇蚊,則退出當(dāng)前shell.
通過(guò)Fir-cli命令上傳到Fir平臺(tái)
# 將XXX替換成自己的Fir平臺(tái)的token
fir login -T XXX
fir publish $exportIpaPath/$scheme_name.ipa
通過(guò)altool工具提交ipa包到app store
這個(gè)工具實(shí)際上是Application Loader
,打開(kāi)Xcode-左上角Xcode-Open Developer Tool-Application Loader
可看到
altool的路徑是:
/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Support/altool
#驗(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
整個(gè)過(guò)程和原理還算比較簡(jiǎn)單仗岸,shell腳本還是滿有意思的,作為蘋果開(kāi)發(fā)人員借笙,有必要學(xué)習(xí)一下扒怖,本人也剛學(xué)習(xí)shell 不久,歡迎大家交流业稼。
參考文檔:
http://www.reibang.com/p/bd4c22952e01
https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/xcodebuild.1.html