iOS - 開發一套代碼多個app展現不一樣圖標和名稱

引言

公司項目重構以後,有了相對比較完善的開發體系,首先git分支分爲平常、預發、生產三個主要分支,開發階段都在平常(daily)分支下開相應功能的feature分支,開發完再合併。git

個人iOS工程須要知足這個開發體系,那麼我必須能實現如下訴求:

  1. 構建不一樣的宏來方便切換相應的配置;github

  2. 配置三種數據環境根據宏的切換進行切換;工具

  3. 三種圖標/應用名稱根據宏的切換進行切換顯示;測試

  4. 至少兩個類型的包能同時安裝在手機上;ui

  5. 最好能使用腳本實現自動化打包放入bugly或者蒲公英等平臺供內部測試人員下載;spa

網上已經有不少相似的講解,可是我發現這其中仍是會遇到一些意想不到的問題,好比pods工程的相應配置、應用名與'.strings'文件的衝突、使用命令行打包 等等問題,下面我將整個配置方法以及其過程當中遇到的問題及解決方案分享出來,這也是本文的主要用意,以供你們參考和我本身溫故。
Demo切換Configuration能同時安裝在一個手機上三種版本:
命令行

 

勘誤

由於日前iPhone 7的發佈,題主提早下載了Xcode 8 beta版,將公司項目在iOS 10上面跑了一下,發現了不少的變更(例如:基本上全部的系統權限都須要在info.plist中聲明、導航欄透明度動態設置問題),其中與本文相關的一個問題在此說明一下:設計

正文中的的5、配置不一樣的Bundle ID在使用User-Defined方式在Xcode 8 beta中設置無效,其實跟圖標同樣,在Target的Build Setting下的Packaging中一樣有默認的設置項,咱們能夠根據本身的須要設置各類scheme下的配置不一樣的Bundle ID,以下圖:code

正文

首先,咱們都知道iOS設備上的App是根據AppID也就是工程中的Bundle ID來識別App的。默認Xcode爲每一個target提供2個Build配置項(Build Configuration):Debug和Release。orm

1、建立多個Configuration

以下圖,有兩種方法能夠用來建立咱們須要新增的Build Configuration,這裏新建一個名爲Preform的配置項,是爲了知足App的開發環境(Debug)、預發環境(Preform)、線上環境(Release)三套數據環境的切換。

2、數據環境的配置

上面新增了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一下,才能放心使用。

3、配置不一樣的AppIcon

配置AppIcon有兩種必比較方便的方法。

第一種:

首先咱們須要找UI設計師要三套不同的圖標,以下圖這樣取好對應的名稱放入Assets.xcassets中:

而後再當前Target的Build Setting下搜索icon找到Asset Catalog App Icon Set Name,而後進行以下配置:

而後Edit Scheme選擇相應的Configuration進行編譯或者打包就能打出不一樣的圖標了。

第二種

使用User-Defined配置三種Configuration下的變量,在info.plist中進行配置,配置方法與下面的應用名稱配置相似,這裏不作過多描述。

4、配置不一樣的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,使你的設置沒有做用。

5、配置不一樣的Bundle ID

爲了使打出來的三種包可以共同存在同一臺手機上,咱們須要像配置應用名稱同樣,新建一個User-Defined來根據不一樣的Configuration使用不一樣的Bundle ID打包。
配置方法與配置應用名稱一致這裏也過多描述。

配置完成以後,同一個App就可以在一臺手機上面安裝多個不一樣的包啦!

6、腳本打包

在這裏推薦大夥兒一個工具,CLI for Building & Distributing iOS Apps (.ipa Files),相似的自動打包工具備不少,這個目前能知足個人需求,上手很快,安裝以後一行代碼便可打出想要的ipa包,後面再抽時間詳細總結一下jenkins+這個工具的使用方法。

最後

分享就先到這裏嘍,歡迎各位看官的指正~

相關文章
相關標籤/搜索