最近公司想要整合打包測試罚屋,打包上線的流程苦囱。想要實(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é)下祖乳。