如何使用Xcode的Targets來管理開發和生產版本的構建

如何建立一個新的Targetios

因此你如何在Xcode中建立一個開發的target?我使用示例項目「todo」引導您一步一步完成整個過程。。您也可使用本身的項目並按照步驟:git

1. 在項目的導航面板進入項目設置。在Targets區域下,右鍵單擊現有目標並選擇 `Duplicate` 複製現有的目標。github

cocoachina_1.png

2.Xcode會詢問你新的target是不是爲iPad開發。對於本教程,咱們只是選擇「Duplicate Only」。swift

cocoachina_2.png

提示:若是您的項目支持通用設備,Xcode不會提示上述消息。api

3.如今咱們有一個名爲`todo copy`的新的target和build scheme。重命名並使之更容易理解。服務器

  • 在Targets列表中選擇新的target。按Enter鍵編輯文本,添加一個更合適的名字。我更傾向於「todo Dev」。你能夠自由選擇任何你喜歡的名字。app

  • 接下來,找到「Manage Schemes…」,選擇您在步驟1中建立的shceme,並按「輸入」,使scheme的名稱和新的target的名稱相同(這是你爲新的target所選擇的名字)ide

cocoachina_3.png

4. 步驟4是可選的,但強烈推薦。若是你想簡單地區分開發和生產版本構建,你應該爲每一個版本使用單獨的icon和啓動頁。這將使測試人員更清晰地知道正在使用哪一個app,防止上傳開發版本。測試

跳到 `Assets.xcassets` 添加一個新的圖標。右擊圖標 > App Icons & Launch Images > New iOS App Icon. 新圖標重命名爲「AppIcon-Dev」同時添加本身的圖片。ui

cocoachina_4.jpg

5.如今回到項目設置,選擇您的開發target,並改變Bundle Identifier。你能夠簡單地將「Dev」追加到原來的ID上。若是執行了步驟4,請確保更改應用app icon,設置爲在上一步中建立的。

cocoachina_5.png

 

6. Xcode會自動爲你的target添加plist文件(如todo copy-Info.plist)。你能夠在項目的根文件夾找到它。將它從「copy」重命名爲「Dev」,並將它放在原始的plist文件下。這裏你將更容易管理文件。

7. 如今打開你開發target的「Build Settings」,滾動到「Packaging」,並將值改成開發的plist文件(todo Dev.plist)。

cocoachina_6.png

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

 
對於Objective-C的項目,去到`Build Settings`下`Apple LLVM 7.0 - Preprocessing`。拓展`Preprocessor Macros`在Rebug和Release區域添加一個變量。對於開發target(即todo Dev),將該值設置爲`DEVELOPMENT=1`。(注意=先後不能右空格,有空格會編譯不過)另外一個,將值設爲`DEVELOPMENT=0`來表示生產版本。

cocoachina_7.png

cocoachina_8.png

對於swift的項目,編譯器再也不支持預處理指令。做爲替代,它使用編譯時的屬性和build配置。選中開發target,添加一個標識表示開發版本。找到`Build Setting`往下滾動到`Swift Compiler - Custom Flags`部分。將值設爲`-DDEVELOPMENT`表示這個target做爲開發版本。

cocoachina_9.png

如今,您已經建立並配置了開發target,下一步呢?

使用Target和宏

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

Objective-C:

1
2
3
4
5
6
7
#if DEVELOPMENT
#define SERVER_URL @"http://dev.server.com/api/"
#define API_TOKEN @"DI2023409jf90ew"
#else
#define SERVER_URL @"http://prod.server.com/api/"
#define API_TOKEN @"71a629j0f090232"
#endif

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

Swift:

1
2
3
4
5
6
7
#if DEVELOPMENT
let SERVER_URL =  "http://dev.server.com/api/"
let API_TOKEN =  "DI2023409jf90ew"
#else
let SERVER_URL =  "http://prod.server.com/api/"
let API_TOKEN =  "71a629j0f090232"
#endif

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

提示:一般,你會把上面的代碼放在app delegate中。但這最終是取決於你在哪裏初始化應用程序設置。

如今,當您選擇「todo Dev」scheme運行項目,你建立開發版本會自動將服務器的配置設置爲開發環境。如今,您能夠上傳開發版本到TestFlight 或 HockeyApp供測試人員和管理人員來測試。

接着若是你須要建立一個生產版本,您能夠簡單地選擇"todo"scheme。不須要更改代碼。

管理多個target的一些注意事項

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

cocoachina_10.png

2.若是你使用的CocoaPods,不要忘了添加新的target到你的podfile中。您可使用`link_with`指定多個target。您能夠進一步細節請查閱的 CocoaPods 文檔。你的podfile看起來是這樣的:

1
2
3
4
5
6
platform :ios,  '7.0'
workspace  'todo'
link_with  'todo' 'todo Dev'
pod  'Mixpanel'
pod  'AFNetworking'

3.若是你使用持續集成系統,如 Travis CI 或Jenkins,別忘了配置兩個target的build和deliver。

相關文章
相關標籤/搜索