一、前言
在開始之前先嘮叨兩句自己對iOS自動化打包的接觸,覺得沒啥看頭滴老鐵可以略過直接從第二部分開始。項目自動打包提交的優(yōu)勢不用說了,很高效便捷的東西,很早就接觸到了,但是一直沒有用到項目中,分析一下主要有以下幾個原因:
- 項目不是很大很雜。
- 協(xié)同開發(fā)的人員也不多。
- 新開項目或新加某個業(yè)務(wù)功能,一般都是把整個功能做完再進行測試,不需要反復(fù)打包。
- 測試人員不多,用Xcode可以直接快速給測試設(shè)備裝好新包。
總結(jié)以上原因,一直沒有用到自動打包技術(shù)。而現(xiàn)在的情況是,
- 隨著項目功能模塊不斷增加,即使發(fā)包不頻繁,每次發(fā)包到AppStore,從選擇簽名證書、配置文件(現(xiàn)在有
Xcode自動管理
,這一步可以省略)、編譯歸檔、導出、上傳等至少也得一個小時,還需要一直盯著。再者,由于蘋果的審核很嚴,每次拒過都需要改一點代碼再重新構(gòu)建新包發(fā)布,又會重復(fù)上面的痛苦過程。 - 蘋果手機系統(tǒng)更新頻繁,每次推出新系統(tǒng),同事會情不自禁安裝最新的系統(tǒng),這個時候,低版本的Xcode給手機刷不了,又得更新Xcode。
- 前段時間公司又新開了兩個項目,洋洋灑灑兩個月做完了,也該測試了,可是打測試包一直不成功,
Xcode 9.0
以前的版本卻沒問題,后面想到用自動打包來試試,自動打包也完全OK。
基于以上的情況,所以想自己寫一個自動打包的腳本,能夠?qū)崿F(xiàn)只運行一句命令就自動編譯打包發(fā)布
,啥都不要做,掛著就行,打包完自動打開頁面提醒。
二、功能概述
- 支持多個Target的項目構(gòu)建。
- 發(fā)布平臺:AppStore、蒲公英、fir
- 項目類型:支持project和workspace項目。
- 支持一鍵構(gòu)建并發(fā)布Debug包到蒲公英平臺。
三、使用
打包所需要的文件已經(jīng)掛在Github上了。只需要把BuildTool
文件夾復(fù)制
到項目主目錄
,注意是復(fù)制!不是拖入項目主目錄,因為蘋果審核有屏蔽fir關(guān)鍵詞。然后打開終端,cd
到BuildTool
文件夾,輸入 sh build.sh
命令,回車,開始執(zhí)行此打包腳本。
1. build.sh腳本
具體的使用方法和參數(shù)配置shell腳本
里面已經(jīng)有非常詳細的注釋。
2. .plist文件
有 AppStoreExportOptions.plist
和 AdHocExportOptions.plist
兩個plist文件,分別對應(yīng)發(fā)布到AppStore和AdHoc(蒲公英、fir)。簡單說一下里面的屬性:
沒有注釋的屬性項,根據(jù)項目情況自行設(shè)置,一般不需要更改。配置文件(provisioningProfiles)可以添加多個,主要是針對項目中存在多個Target時情況,每個Target的BundleID也會不一樣,所以也需要對應(yīng)的證書和配置文件來跟Target匹配,如果只有一個Target不需要管。
四、推薦內(nèi)容
寫完腳本后,發(fā)現(xiàn)已經(jīng)有老鐵對打包腳本做了很詳細的分析了:詳解Shell腳本實現(xiàn)iOS自動化編譯打包提交。也有老鐵早就寫了iOS自動打包的腳本:xcode_shell。
看了一下,功能也比較全,比如上傳包到自己的服務(wù)器、上傳完成發(fā)郵件測試人員。但是現(xiàn)在已經(jīng)有第三方平臺也做到了比這更多的功能,比如蒲公英,還可以手機短信通知測試人員,有專門的頁面外鏈,支持持續(xù)集成等。
老鐵們?nèi)绻€有什么建議,歡迎在下面給我留言或私信。?? ?? ??
五、問題
問題一(更新于2018年11月14日):
升級Xcode 10
以上版本,蘋果采用新的構(gòu)建系統(tǒng),之前的xcodebuild clean
命令已經(jīng)無法使用,如果用這個命令的話會報錯,蘋果給的建議是刪除根目錄下的build
目錄文件夾,刪除就可以完整打包了。但是每次打包都需要再刪除一遍,由于這個目錄的主要作用就是存儲該項目的歷史構(gòu)建包(Archive歸檔文件和iPA包)
,所以解決辦法是:
- 建一個其他名字的文件夾用來存儲項目的歷史構(gòu)建包(目前本腳本添加的文件夾名為BuildDir),然后將原來build文件夾里面的
IPADir文件夾
和XcarchiveDir文件夾
移到BuildDir文件夾
中。
- 建一個其他名字的文件夾用來存儲項目的歷史構(gòu)建包(目前本腳本添加的文件夾名為BuildDir),然后將原來build文件夾里面的
- 刪除
build文件夾
。
- 刪除
- 直接找到腳本里面的所有
/build/
,替換為/BuildDir/
即可。
- 直接找到腳本里面的所有