iOS命令行自動(dòng)化集成打包全記錄(多個(gè)target,多種環(huán)境)

最近公司想要整合打包測試罚屋,打包上線的流程苦囱。想要實(shí)現(xiàn)iOS快速的出包

我們公司采用的是jenkins+fir.實(shí)現(xiàn)的原理是自動(dòng)到Git倉庫中拉取最新的代碼脾猛,然后下載到指定的一臺蘋果電腦上撕彤,打完包之后再上傳到服務(wù)端供測試和運(yùn)維人員進(jìn)行下載使用。

因?yàn)槲覀児娟P(guān)于jenkins是Java研發(fā)在弄猛拴,關(guān)于這個(gè)我就不進(jìn)行贅述羹铅。

1.公司項(xiàng)目情況分析:

--我們公司一共有三款產(chǎn)品:xxx金服,xxx金服專業(yè)版愉昆,xxx金服活動(dòng)版职员。這三款產(chǎn)品共用相同代碼,但是圖片素材是不一樣的跛溉,所以是在同一個(gè)project中的焊切。

--打包環(huán)境有:develop(開發(fā)) test(測試) production(線上)local(本地)

--現(xiàn)在我們來整理一下:三種產(chǎn)品,四種環(huán)境芳室。這代表了有12種情況需要通過命令行來區(qū)分专肪。

2.解決的辦法:

--解決的辦法:通過不同的target來區(qū)分不同的版本,通過不同的configuration來區(qū)分不同的環(huán)境配置和key堪侯。

--xcodebuild的命令可以進(jìn)行Xcode命令行打包,相關(guān)命令可以再終端輸入man xcodebuild查看嚎尤,或是直接看蘋果官方文檔點(diǎn)我點(diǎn)我

--xcodebuild archive 是打包命令抖格,其中有一個(gè)參數(shù)是-configuration 它對應(yīng)參數(shù)如下:


--我們可以通過指定-configuration 和-scheme的參數(shù)來對應(yīng)執(zhí)行不同的環(huán)境和版本诺苹。初始默認(rèn)狀況configuration只有Debug和Release兩種情況咕晋。我們可以通過添加.xcconfig文件來添加不同的configuration。

3.集成過程:

3.1.創(chuàng)建多個(gè)target收奔,優(yōu)化圖片資源的引用:------

--之前我們公司三款產(chǎn)品是共用一套代碼掌呜,共用一個(gè)target,我是在每次打包的時(shí)候手動(dòng)修改圖片素材還有bundle ID坪哄,displayName等等质蕉。這樣人工成本太大,而且易出錯(cuò)翩肌。并且對于命令行打包三個(gè)不同的版本更是很難實(shí)現(xiàn)模暗,因此我使用了三個(gè)Target分別對應(yīng)三個(gè)項(xiàng)目。如下圖復(fù)制另外兩個(gè)target念祭,然后將使用的素材素材庫更改兑宇。

--但這樣出現(xiàn)了一個(gè)問題,就是三套圖片我都需要放在Assets.xcassets文件中粱坤,然后代碼內(nèi)部判斷bundle ID來選擇不同的素材隶糕。這樣導(dǎo)致的問題就是導(dǎo)出來的ipa包從原來的29M變?yōu)榱?5M.因?yàn)閍chive的時(shí)候鏈接的.xcassets素材過多。

--現(xiàn)創(chuàng)建三個(gè)版本對應(yīng)的Assets.xcassets文件站玄,如圖:


--三個(gè)版本相同的素材放在Assets.xcassets中枚驻,不同的放在對應(yīng)的文件中,Normal(標(biāo)準(zhǔn)版)株旷,Pro(專業(yè)版)再登,Nat(活動(dòng)版)

--在三個(gè)版本target中,在copy bundle resource中只添加對應(yīng)的.xcassets文件和Assets.xcassets就可以了晾剖。


--再次編譯你就會(huì)發(fā)現(xiàn)ipa又變回了之前的大小锉矢。同理配置其余兩個(gè)target。

3.2.增加15個(gè).xcconfig文件--------------

--一共我們需要1.Debug 2.Release 3.Adhoc 4.Local 5.Test 五種configuration 钞瀑,如圖沈撞。


--根據(jù)項(xiàng)目情況,每個(gè)配置文件中都包含同樣的 key 值雕什,內(nèi)容如下:

#include "Pods/Target Support Files/Pods-zkp/Pods-zkp.debug.xcconfig"

//網(wǎng)絡(luò)請求baseurl

REQUEST_BASE_URL = @"http:\/\/xxxx/resource/"

AGREEMENT_BASE_URL = @"http:\/\/xxxx/resource/product/agrHtml?prdCode="

H5_BASE_URL = @"http:\/\/xxxx"

SECRET = @"xxxxxx"

CLIENTID = @"xxxxx"

//App

APPSCHEM = @"cn.com.xxx.zkp"

APPID = @"xxxxxx"

//友盟配置

UmengAppkey = @"xxxxxxxxxxxxxxxxxxx"

//百度統(tǒng)計(jì)

BaiduMobKey = @"xxxxxxxxxxxxxxx"

//微信

WeChatKey = @"xxxxxxxxxxxxx"

WeChatSecret = @"xxxxxxxxxxxxxxxxxxxx"

#include "../ZKPGenerator.xcconfig"

--你可在配置文件中包含其他配置文件缠俺,其中 Generator.xcconfig 文件的內(nèi)容是:

GCC_PREPROCESSOR_DEFINITIONS = $(inherited) ZKPPrefix='$(REQUEST_BASE_URL)' ZKPAgreement='$(AGREEMENT_BASE_URL)' WebViewBaseURL='$(H5_BASE_URL)' UmengAppkey='$(UmengAppkey)' WeChatKey='$(WeChatKey)' WeChatSecret='$(WeChatSecret)' BaiduMobKey='$(BaiduMobKey)' CLIENTID='$(CLIENTID)'? SECRET='$(SECRET)' APPSCHEM='$(APPSCHEM)' APPID='$(APPID)'

--其作用是將配置文件中定義的常量定義成預(yù)編譯宏,以便于在代碼中獲取贷岸。有點(diǎn)類似我們項(xiàng)目中的PCH文件 其中GCC_PREPROCESSOR_DEFINITIONS, 文檔如下:

Space-separated list of option specifications. Specifies preprocessor macros in the form foo (for a simple #define) or foo=1 (for a value definition). This list is passed to the compiler through the gcc -D option when compiling precompiled headers and implementation files.

--GCC_PREPROCESSOR_DEFINITIONS 是 GCC 預(yù)編譯頭參數(shù)壹士,通常我們可以在 Project 文件下的 Build

Settings 對預(yù)編譯宏定義進(jìn)行默認(rèn)賦值。在 Xcode下的路徑為 Build Settings->Apple LLVM 8.0

-Preprocessing->Preprocessor Macros

--注意事項(xiàng):

1>.此處要注意域名的轉(zhuǎn)譯:http:\/\/xxxx/xxxx/ 不能寫 為http://xxxx/xxxx/偿警,因?yàn)槟J(rèn)會(huì)將http:后面的內(nèi)容注釋掉躏救。

2>.但是在轉(zhuǎn)譯之后,在編譯項(xiàng)目的時(shí)候會(huì)出現(xiàn)警告。因?yàn)閤code警告機(jī)制不能識別轉(zhuǎn)譯符盒使,而且往往這種警告會(huì)有上百個(gè)崩掘,因?yàn)橛蛎暮晁芯W(wǎng)絡(luò)請求都會(huì)用到。如下圖:


3>.解決辦法忽略警告少办。右鍵警告->Reveal in Log


4>.此處就是這個(gè)警告的描述苞慢,復(fù)制之后進(jìn)入build setting中將該警告進(jìn)行忽略


5>.在build setting中搜索other warning,將剛剛的警告標(biāo)示寫入并以-隔開英妓。如下:-Wunknown-escape-sequence

-W是前綴挽放,如果要忽略需要添加為-Wno-unknown-escape-sequence,保存蔓纠,再編譯辑畦,是不是發(fā)現(xiàn)警告就消失了


3.3.創(chuàng)建5種configuration--------------

--創(chuàng)建configuration,添加對應(yīng)的5種configuration腿倚,在添加Adhoc的時(shí)候是copy自Release纯出,其余的都是copy自Debug


--修改.xcconfig 文件里的宏要特別注意緩存,經(jīng)常會(huì)出現(xiàn)修改之后還用的是之前的值敷燎。這個(gè)時(shí)候xcode clean是沒有用的潦刃。

--解決辦法:將DerivedData中的緩存刪除,然后重啟xcode懈叹。


--將剛剛創(chuàng)建好.xcconfig文件的對應(yīng)添加進(jìn)去


3.4.配置證書和描述文件--------------

--電腦和xcode配置對應(yīng)的證書和描述文件: 至此基本就大功告成,然后對應(yīng)的在開發(fā)者后臺配置證書:

3.4.1.證書:

? ? ? ? ? ?1>.開發(fā)證書

? ? ? ? ? ?2>.發(fā)布證書

3.4.2.描述文件:

? ? ? ? ? 1>.開發(fā)(用來跑真機(jī)的)分扎,對應(yīng)開發(fā)證書

? ? ? ? ? 2>.Adhoc證書(用來給測試安裝測試包)澄成,對應(yīng)發(fā)布證書

? ? ? ? ? 3>.發(fā)布證書(發(fā)布至App Store),對應(yīng)發(fā)布證書

--安裝好之后畏吓,xcode配置全部結(jié)束墨状。

3.5.執(zhí)行命令--------------------

3.5.1.cd到代碼目錄

3.5.2.開始打包

xcodebuild archive -workspace zkp.xcworkspace -configuration Adhoc -scheme zkp -archivePath zkp.xcarchive CODE_SIGN_IDENTITY="iPhone Distribution: xxxxxxxx(yyyyyyy)" PROVISIONING_PROFILE_SPECIFIER="xxxxxxx"

1>.對應(yīng)的參數(shù)配置

-workspace 工程文件名(用cocopods集成的項(xiàng)目,沒有的話 整個(gè)改為-xcodeproj zkp.xcodeproj)

-configuration 對應(yīng)的環(huán)境配置菲饼,就是編譯的時(shí)候執(zhí)行的模式

-scheme 通過scheme指定不同的target

-archivePath 導(dǎo)出的.xcarchive的路徑

CODE_SIGN_IDENTITY 開發(fā)證書的名稱

PROVISIONING_PROFILE_SPECIFIER 描述文件的名稱

3.5.3.導(dǎo)出ipa

xcodebuild -exportArchive -archivePath zkpPro.xcarchive -exportPath ~/Desktop/專業(yè)版 -exportFormat ipa -exportProvisioningProfile xxxxxxx

1>.對應(yīng)的參數(shù)配置

-archivePath .xcarchive文件的路徑

-exportPath 導(dǎo)出的ipa的路徑

-exportProvisioningProfile 描述文件的名稱(和上述保持一致)

3.5.4.總結(jié):

--iOS在archive的時(shí)候就會(huì)進(jìn)行簽名肾砂,然后導(dǎo)出的時(shí)候再度進(jìn)行簽名驗(yàn)證,此處和Android有區(qū)別宏悦,Android打包的時(shí)候并不會(huì)進(jìn)行簽名镐确,在導(dǎo)出的時(shí)候才會(huì)進(jìn)行簽名。因此iOS在打包饼煞,和導(dǎo)出的時(shí)候都要指定簽名源葫。

--上述命令是筆者自己整理出來的,親測有效砖瞧,有問題歡迎評論息堂。通過這個(gè)可以不再xcode內(nèi)部指定證書,因?yàn)椴恢挂粋€(gè)人開發(fā),如果其他開發(fā)人員不小心改動(dòng)了荣堰,不就扯淡了嘛床未。

--最后xcodebuild命令行打包有個(gè)坑,在首次從倉庫拉下代碼的時(shí)候振坚,在項(xiàng)目沒有打開之前執(zhí)行xcodebuild

--achive命令的時(shí)候會(huì)卡在下圖的場景里薇搁。但如果是項(xiàng)目已經(jīng)打開了則不會(huì)卡住,會(huì)achive成功屡拨。


--究其原因由于 scheme 文件不存在造成的只酥。而scheme文件是存儲在xcuserdata文件夾下,工程項(xiàng)目在沒有打開之前xcuserdata文件下是沒有內(nèi)容的呀狼,打開之后才會(huì)默認(rèn)生成裂允。但是 xcodebuild 工具不會(huì),在執(zhí)行 archive 的時(shí)候會(huì)卡死哥艇。

--解決辦法:

1>.選擇manager scheme

2>.選擇共享scheme

--之后再打包就可以了绝编。

--至此關(guān)于CI自動(dòng)化打包,關(guān)于iOS端需要配置的工作就都做完了貌踏。因?yàn)閮?nèi)部是多個(gè)target十饥,前前后后遇到挺多坑的,特此總結(jié)下祖乳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逗堵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子眷昆,更是在濱河造成了極大的恐慌蜒秤,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亚斋,死亡現(xiàn)場離奇詭異作媚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)帅刊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門纸泡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赖瞒,你說我怎么就攤上這事女揭。” “怎么了冒黑?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵田绑,是天一觀的道長。 經(jīng)常有香客問我抡爹,道長掩驱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮欧穴,結(jié)果婚禮上民逼,老公的妹妹穿的比我還像新娘。我一直安慰自己涮帘,他們只是感情好拼苍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著调缨,像睡著了一般疮鲫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弦叶,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天俊犯,我揣著相機(jī)與錄音,去河邊找鬼伤哺。 笑死燕侠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的立莉。 我是一名探鬼主播绢彤,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜓耻!你這毒婦竟也來了茫舶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤刹淌,失蹤者是張志新(化名)和其女友劉穎奇适,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芦鳍,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年葛账,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柠衅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡籍琳,死狀恐怖菲宴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情趋急,我是刑警寧澤喝峦,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站呜达,受9級特大地震影響谣蠢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一眉踱、第九天 我趴在偏房一處隱蔽的房頂上張望挤忙。 院中可真熱鬧,春花似錦谈喳、人聲如沸册烈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赏僧。三九已至,卻和暖如春扭倾,著一層夾襖步出監(jiān)牢的瞬間淀零,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工吆录, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窑滞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓恢筝,卻偏偏與公主長得像哀卫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子撬槽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容