特別說明:如果項目沒有采用Cocoapods管理,沒有.xcworkspace,只有xcodeproj;只需要將腳本中這句
xcodebuild \
archive -workspace ${project_path}/${project_name}.xcworkspace \
這句替換成下面這樣就ok了
xcodebuild \
archive -project ${project_path}/${project_name}.xcodeproj \
日常編譯打包工作主要是以下兩個目的:
- 提交測試版本ipa給測試人員
配置好測試描述文件,然后Product -> Archive
編譯打包,選擇Organizer
,導出ad hoc 的 ipa
包。再上傳到Fir等第三方平臺上,然后通知測試同事進行測試。整個流程下來需要人工監守操作比較耗費時間。 - 提交ipa包到App Store已供審核
配置好正式的描述文件,然后同樣的方式打包導出app store 的 ipa
包。通過Application Loader 等方式
提交到App store等待蘋果處理二進制包,處理完后選擇構建版本,最后提交等待蘋果審核。
無論打測試包提供測試人員測試還是打正式包上傳到App strore,整個過程都是重復耗費人工的操作,需要人工等待,然后各種點擊選擇...我們可以通過編寫腳本語言來實現整個過程。
配置自動打包發布的流程
通過下面幾步的設置好之后,以后再進行打包發布到第三方平臺或者App Store 只需要一步就能搞定了(一個回車搞定)
筆者通過shell腳本
實現從archive->生成ipa->上傳到第三方平臺(Fir.im 、蒲公英)或 App store
。通過下面幾步即可實現自動打包上傳功能。
- 下載Shell腳本
- 將archiveScript中的幾文件拖入工程的根目錄
- 根據自己需求選擇好描述文件
- 根據自己的項目修改一下shell.sh (修改哪里下面會指出)
- cd到工程根目錄,通過./shell.sh 執行腳本即可
下面通過實例詳細演示整個過程
第一種:打包上傳到第三方平臺Fir (上傳蒲公英原理一樣)
第二種:打包上傳到App store
將通過這幾步來講解整個過程
- 準備工作
- 準備工作做完后,正式開啟自動化之路
- 自動化腳本執行過程中可能遇到的錯誤
準備工作
-
因為要上傳到Fir平臺,需要先安裝fir-cli
安裝fir-cli -
如果沒有安裝過rvm,需要安裝rvm,在終端輸入
rvm -v
命令查看,如果打印出rvm:command not found
說明沒有安裝過rvm,如果能打印出rvm版本等信息說明安裝過。如果沒有安裝過rvm可以通過下面的命安裝,如果已經安裝過可以忽略。- 在終端輸入
curl -L get.rvm.io | bash -s stable
,然后稍等一會rvm就安裝好了 - 在終端輸入
source ~/.bashrc
- 在終端輸入
source ~/.bash_profile
- 再輸入
rvm -v
查看安裝成功
- 在終端輸入
準備工作做完后,正式開啟自動化之路
一、將archiveScript中的3個文件拖入工程的根目錄
二、根據自己需求選擇好描述文件
三、修改一下shell.sh 文件
Product ->Scheme -> Edit Scheme 查看自己的scheme_name
獲取Fir平臺的token
三、 cd到工程根目錄,./shell.sh 回車就會執行腳本
四、 根據自己的需求選擇即可
如果開始選擇的1:app-store 會發布到app store
如果開始選擇的2:ad-hoc 發布到fir平臺
如果遇到下面的錯誤
解決方法:在終端 輸入rvm system
后重新執行sehll腳本就可以了
如果前面已經安裝過fir-cli,但是在腳本執行過程中任然報fir:command not found
的錯誤
解決辦法: 在終端輸入rvm get head
執行完畢后再次執行腳本就ok了
到這里就已經實現了通過腳本打包并發布到第三方平臺Fir 和 Appstore的整個流程。接下來對shell中的腳本和一些自動化原理進行簡單說明
shell中的腳本和一些自動化原理
正常情況下手動在Xcode中執行Product -> Archive
, 在Xcode底層是通過xcodebuild相關的命令編譯、打包生成ipa包的.(xcodebuild主要是用來編譯,打包成Archive和導出ipa包)
進入終端可以通過下面的命令查看一下xcodebuild的version
接下來,看一下Shell腳本
上面內容注釋大家一看應該就明白
清理構建目錄
xcodebuild \
clean -configuration ${development_mode}
編譯之前先clean下,就如同在Xcode進行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進行Product -> Archive
這一步最為耗時.
將Archive導出ipa
xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive \
-configuration ${development_mode} \
-exportPath ${exportIpaPath} \
-exportOptionsPlist ${exportOptionsPlistPath}
將生成的.xcarchive文件導出.ipa包到指定的exportIpaPath路徑下。
說明:
用\來進行換行分隔,一條shell命令過長時可以進行分割顯示.
$變量名是引用變量,拿來使用
|| exit 指明如果這一條命令執行失敗,則退出當前shell.
通過Fir-cli命令上傳到Fir平臺
# 將XXX替換成自己的Fir平臺的token
fir login -T XXX
fir publish $exportIpaPath/$scheme_name.ipa
通過altool工具提交ipa包到app store
這個工具實際上是Application Loader
,打開Xcode-左上角Xcode-Open Developer Tool-Application Loader
可看到
altool的路徑是:
/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Support/altool
#驗證并上傳到App Store
# 將-u 后面的XXX替換成自己的AppleID的賬號,-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
整個過程和原理還算比較簡單,shell腳本還是滿有意思的,作為蘋果開發人員,有必要學習一下,本人也剛學習shell 不久,歡迎大家交流。
參考文檔:
http://www.lxweimin.com/p/bd4c22952e01
https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/xcodebuild.1.html