最詳細 Xcode的Targets管理項目的公開版本、測試版本、預發布版本等等

前言:

最近在研究swift發現很久沒有更新文章了,看著時差那么久沒有更新有點急躁了,但又不知道要分享內容好一點又實用的文章,最近寫項目上線的次數比較頻繁,上線時對于Xcode的配置也是諸多操作,問題是,一些web服務的url指向了測試服務器,同時API密鑰被配置用于測試環境。在提交app給蘋果審核前,你需要修改所有這些API密鑰和URL以適應生產版本,相較于在開發環境和生產環境之間來回修改相關數值,對于這種繁瑣的操作和弊端想著要優化了,所以這兩天就去研究了一下Targets管理項目。

對于iOS開發的老鳥來說這已經不是事兒了,但對于初學者來說很多人就會覺得奇怪,為什么需要使用兩個單獨的數據庫和環境。原因是當你繼續構建新的功能特性或繼續開發你的應用,你希望區分開現有的公開版本和生產版本和預發布版本。

區分版本的方法一:

因為公司的開發團隊的嚴謹把數據庫的接口區分為公開環境、預發布環境、測試環境,那么就必須把項目使用三個獨立的環境區分開來。我之前使用的一個辦法就是定義一個全局的變量,它會將應用程序初始化為公開版本、測試版本、預發布版本。

Objective-C:

在PCH文件中定義成宏(這里就不教大家怎么新建配置PCH了)

要哪個環境就打開注釋,關閉另外兩個注釋

#define LocalEnvironment? ? ? ? //測試環境

//#define ReleaseEnvironment ? ? //預發布環境

//#define OfficialEnvironment? ? ? //公開環境

#ifdef LocalEnvironment

#define APIURL @"http://www.test.myapi.net"? ? //APIURL 為后臺接口

#endif?

#ifdef ReleaseEnvironment

#define APIURL @"http://www.release.myapi.net"

#endif

#ifdef OfficialEnvironment

#define APIURL @"http://www.myapi.net"

#endif

Swift3.0后:

新建一個 Swift File 文件,定義成全局常量

enum environmentType {

case local, release, official ? ? ? //測試環境,預發布環境,公開環境

}

//給測試人員的時候切換他們想要的環境,上線的時候切換official環境

let environment: environmentType = .official ? ?

let APIURL: String = ""? ? ? ? ? ? //APIURL 為后臺接口

switch environment {

case .local:

APIURL = "http://www.test.myapi.net" ? ? ? ??

case .release:

APIURL = "http://www.release.myapi.net"

case .official:

APIURL = "http://www.myapi.net"?

}?

弊端:這種方法需要你每次切換環境時改變全局變量。雖然這種方法也許快捷,方便,但是它有一些重要的限制。首先,因為我們在開發和生產兩個環境中使用一個Bundle ID,你不能在一臺設備上安裝應用的兩個版本。當你需要要測試開發版本的應用程序時,同時仍在該設備上使用生產版本的應用,這就變的不方便了。此外,這種方法很有可能將應用的開發版本上傳到應用商店。如果你忘記了改變這個全局變量,你將會上傳錯誤的應用給你的用戶。

區分版本的方法二:

創建新的Target,我將使用一個事例項目引導學者們一步步探討整個過程(通用Objective-C、Swift)

1.首先新建一個項目取名Happy,可以看到只有一個TARGETS,我們把這個target作為公開版本。

2.配置測試版本和預發布版本。

? ?3.選擇 Duplicate Only,需要新建兩個因為需要再新建兩個版本

4.現在打開你開發target的“Build Settings”,滾動到“Packaging”,并將值改為開發的plist文件。注意:這三個targets對應的代碼相同,但Plist和設置是不同的

5.可選操作:但強烈推薦。如果你想簡單地區分公開版本和預發布版本構建,你應該為每個版本使用單獨的icon和啟動頁。這將使測試人員更清晰地知道正在使用哪個app,防止上傳開發版本。

跳到 `Assets.xcassets` 添加一個新的圖標。右擊圖標 > App Icons & Launch Images > New iOS App Icon. 新圖標重命名為“AppIcon-Release”同時添加自己的圖片。

現在回到項目設置,選擇您的開發target,并改變Bundle Identifier。你可以簡單地將“Release”追加到原來的ID上。如果執行了上一步驟,請確保更改應用app icon,設置為在上一步中創建的。(PS:改變Bundle Identifier的話需要重新去官網弄好區分這個Bundle Identifier的測試證書)

6.最后,我們會為生產和開發target配置預處理宏/編譯器標識。之后我們就可以使用該標識在我們的代碼來檢測應用程序正在運行的版本。

Objective-C

去到`Build Settings`下`Apple LLVM 7.0 - Preprocessing`。拓展`Preprocessor Macros`在Rebug和Release區域添加一個變量。對于公開版本target(即Happy),將該值設置為`DEVELOPMENT=2`。對于預發布版本target(即Happy Release),將該值設置為`DEVELOPMENT=1`。對于測試版本target(即Happy Test),將該值設置為`DEVELOPMENT=0`。

Swift

編譯器不再支持預處理指令。作為替代,它使用編譯時的屬性和build配置。選中開發target,添加一個標識表示開發版本。找到`Build Setting`往下滾動到`Swift Compiler - Custom Flags`部分。將值設為`-DTEST`表示這個target作為測試版本。將值設為`-DRELEASE`表示這個target作為預發布版本。將值設為`-DOFFICIAL`表示這個target作為公開版本。

使用Target和宏

根據已配置的宏DEV_VERSION,我們可以在代碼中利用它動態地編譯項目。下面是一個簡單的例子:

Objective-C: 在PCH文件中

#if DEVELOPMENT==0

#define LocalEnvironment ? ? //測試

#elif DEVELOPMENT==1

#define ReleaseEnvironment //預發布

#elif DEVELOPMENT==2

#define OfficialEnvironment ? ?//公開

#endif

#ifdef LocalEnvironment

#define APIURL @"http://www.test.myapi.net"? ? //APIURL 為后臺接口

#endif

#ifdef ReleaseEnvironment

#define APIURL @"http://www.release.myapi.net"

#endif

#ifdef OfficialEnvironment

#define APIURL @"http://www.myapi.net"

#endif

Objective-C中你可以使用`#if`檢查`DEVELOPMENT`的環境,并相應的設置URLs/ API密鑰。


Swift: 在新建的Swift File文件中,聲明成全局常量

#if TEST ? ? ? ? ? ? ? ? ? ? //測試

let SERVER_URL = "http://www.test.myapi.net"

#elseif RELEASE ? ? ? //預發布

let SERVER_URL = "http://www.release.myapi.net"

#else ? ? ? ? ? ? ? ? ? ? ? ? ? //公開

let SERVER_URL = "http://www.myapi.net"

#endif

像這樣

Swift中你仍然可以使用`#if`判定build的參數動態編譯。然而,除了使用`#define`定義基本常量,在swift中我們也可以用`let`定義一個全局常量。

驗證:

最后,管理多個target的一些注意事項:

1.當你添加新的文件到項目中,不要忘記選擇兩個target,以保持你的代碼同步在這三個版本。

2.如果你使用的CocoaPods,不要忘了添加新的target到你的Podfile中。

Build setting搜索user header search paths添加 ?${SRCROOT}(表示當前目錄) 防止Import的時候出現錯誤


多Target控制項目的版本操作已經完成,喜歡的朋友動動手指喜歡一下,發現有錯誤希望能和大家溝通提點一下,謝謝大家繼續支持。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容