引言
公司項目重構之后,有了相對比較完善的開發體系,首先git分支分為日常、預發、生產三個主要分支,開發階段都在日常(daily)分支下開相應功能的feature分支,開發完再合並。
我的iOS工程需要滿足這個開發體系,那么我必須能實現以下訴求:
-
構建不同的宏來方便切換相應的配置;
-
配置三種數據環境根據宏的切換進行切換;
-
三種圖標/應用名稱根據宏的切換進行切換顯示;
-
至少兩個類型的包能同時安裝在手機上;
-
最好能使用腳本實現自動化打包放入bugly或者蒲公英等平台供內部測試人員下載;
網上已經有很多類似的講解,但是我發現這其中還是會遇到一些意想不到的問題,比如pods工程的相應配置、應用名與'.strings'文件的沖突、使用命令行打包 等等問題,下面我將整個配置方法以及其過程中遇到的問題及解決方案分享出來,這也是本文的主要用意,以供大家參考和我自己溫故。
Demo切換Configuration能同時安裝在一個手機上三種版本:
勘誤
因為日前iPhone 7的發布,題主提前下載了Xcode 8 beta版,將公司項目在iOS 10上面跑了一下,發現了很多的變動(例如:基本上所有的系統權限都需要在info.plist中聲明、導航欄透明度動態設置問題),其中與本文相關的一個問題在此說明一下:
正文中的的五、配置不同的Bundle ID在使用User-Defined方式在Xcode 8 beta中設置無效,其實跟圖標一樣,在Target的Build Setting下的Packaging中同樣有默認的設置項,我們可以根據自己的需要設置各種scheme下的配置不同的Bundle ID,如下圖:

正文
首先,我們都知道iOS設備上的App是根據AppID也就是工程中的Bundle ID來識別App的。默認Xcode為每個target提供2個Build配置項(Build Configuration):Debug和Release。
一、創建多個Configuration
如下圖,有兩種方法可以用來創建我們需要新增的Build Configuration,這里新建一個名為Preform的配置項,是為了滿足App的開發環境(Debug)、預發環境(Preform)、線上環境(Release)三套數據環境的切換。


二、數據環境的配置
上面新增了Preform配置項之后,可以在當前Target的Build Setting下搜索macros找到
Preprocessor Macros,可以看到我們剛剛Duplicate 'Release'生成的Preform的Multiple Value與Release的一模一樣,這里我們需要新增PREFORM=1,來定義標示預發環境的宏變量PREFORM,主要是為了方便我們根據這里生成的宏在.pch文件中利用#ifdef來配置好相應的數據環境,這里同樣可以將一些需要區分環境的第三方配置放進來,示意圖及環境配置代碼如下:

#ifdef DEBUG //開發環境 #define EMKEY @"emdevkey" //環信key #define EMAPNS @"emdevapns" //環信secret #define SERVER_HOST @"" #define WEB_HOST @"" #elif PREFORM //預發環境 #define EMKEY @"emdiskey" #define EMAPNS @"emapns" #define SERVER_HOST @"" #define WEB_HOST @"" #else //正式環境 #define EMKEY @"emdiskey" #define EMAPNS @"emapns" #define SERVER_HOST @"" #define WEB_HOST @"" #endif

需要注意的問題:
正常情況下,以上步驟完成之后,如上圖選擇Edit Scheme切換Build Configuration就能編譯出相應環境下的App,但是如果你的App使用pods來管理第三方庫,使用新建的配置項就會報錯找不到第三方的庫文件,錯誤信息類似如下:
原因是pods工程並未自動幫我們創建相應的pod配置項,發現這一點之后我手動創建了一個同樣名為Preform的pod配置項,於是編譯通過了,但是打ipa包的時候始終通不過,繼續查找原因,原來xcconfig文件需要終端執行pod install進行全面配置,所以大家在新建完了之后記得要pod install一下,才能放心使用。
三、配置不同的AppIcon
配置AppIcon有兩種必比較方便的方法。
第一種:
首先我們需要找UI設計師要三套不一樣的圖標,如下圖這樣取好對應的名稱放入Assets.xcassets中:
然后再當前Target的Build Setting下搜索icon找到Asset Catalog App Icon Set Name,然后進行如下配置:

然后Edit Scheme選擇相應的Configuration進行編譯或者打包就能打出不同的圖標了。
第二種
使用User-Defined配置三種Configuration下的變量,在info.plist中進行配置,配置方法與下面的應用名稱配置類似,這里不做過多描述。
四、配置不同的AppName
配置不同的應用名稱,這里需要使用到User-Defined加上info.plist來進行配置;
首先,我們需要新增一個User-Defined,如下圖:
將三種Configuration下的應用名分別設置成:Demo開發版、Demo預發版、Demo。
然后在info.plist中加入Bundle display name,將其設置成我們剛剛新建的User-Defined:
需要注意的問題:
如果你的不小心引入了別的工程的InfoPlist.strings文件,它里面配置的bundle display name設置會覆蓋掉你的User-Defined,使你的設置沒有作用。
五、配置不同的Bundle ID
為了使打出來的三種包能夠共同存在同一台手機上,我們需要像配置應用名稱一樣,新建一個User-Defined來根據不同的Configuration使用不同的Bundle ID打包。
配置方法與配置應用名稱一致這里也過多描述。
配置完成之后,同一個App就能夠在一台手機上面安裝多個不同的包啦!
六、腳本打包
在這里推薦大伙兒一個工具,CLI for Building & Distributing iOS Apps (.ipa Files),類似的自動打包工具有很多,這個目前能滿足我的需求,上手很快,安裝之后一行代碼即可打出想要的ipa包,后面再抽時間詳細總結一下jenkins+這個工具的使用方法。
最后
分享就先到這里嘍,歡迎各位看官的指正~
