寫在前面 : 從項目中遇到一些問題, 簡單總結一下.來個圖感受下
------簡單介紹一下------##
- project就是一個項目,或者說工程,一個project可以對應多個target(你看看上面的圖)
-
targets之間完全沒有關系。但target和project有關系,target的setting會從project settings中繼承一部分(看圖2)
圖2 : project有BuildSetting
圖2 : Targets , 這里的Setting會繼承Project的 -
Target指定了哪些內容?
3.1. Build Phases
Target Dependencies Target依賴,某些Target可能依賴某個Target輸出的值,這里設置依賴
Copy Bundle Resources 是指生成的product的.app內將包含哪些資源文件
Compile Sources 是指將有哪些源代碼被編譯
Link Binary With Libraries 是指編譯過程中會引用哪些庫文件
圖3 : Build Phases
3.2. Info
這個Info.plist文件內定義了一個iPhone項目的很多關鍵性內容, 比如程序名稱, 最終生成product的全局唯一id等等.每一個Target都能設置不同的
------如何創建一個Targets?------
-
創建Target版本 (cimmand + D)
創建版本 -
Xcode 會詢問你這個 target 是不是針對于 iPad 開發的。 “Duplicate Only” 的意思很明顯了吧。
提示:如果你的項目支持通用設置,則 Xcode 不會提示上面的消息。
詢問是否支持ipad -
現在我們有了一個名為 DY Copy, 的新 target 和構建 scheme 。我已經重命名為DYTest了。接下來,來到 “Manage Schemes…”,改名 !
Manage Schemes -
理論上我們應該區分開發版跟生產版的應用,所以我們應該提供不同的應用圖標和啟動界面。這可以使測試更加清楚他們現在使用的版本,并且可以防止我們提交開發版本的應用到商店中。 :grinning:
選中 Assets.xcassets
然后添加新的 App 圖標。選擇 icon > App Icons & Launch Images > New iOS App Icon. 將新圖標命名為 “AppIcon-Test” 并且添加你需要的圖片。然后你肯定要配置一下.
添加圖片
配置 -
配置一下項目(Info, Build Setting等)
現在回到項目設置,選擇開發版的 target 然后修改 bundle ID。可以簡單地在原來的 ID 上添加一個 “Test” 后綴。
Xcode 會自動為新的 target 創建一個 plist 文件(一般命名為 todo copy-Info.plist)。可以在項目的根目錄下找到這個文件。將 “copy” 修改為 “Test”,然后將它放到原來的 plist 文件下方。這樣可以更方便我們對文件進行操作。
自動生成的Plist -
現在選擇開發版 target 下的 “Build Settings”,滾動到 “Packaging”,然后修改指定 plist 文件為開發版 plist(即剛剛的 todo Test.plist)
-
(重要) 最后,為生產版和開發版 target 同時設置一個預處理宏和編譯器標志。這樣在之后的開發中我們就可以在代碼中使用這個標識來檢測當前運行的應用是哪個版本。
對于 Objective-C 項目,來到 Building Settings,滾動到 Apple LLVM 7.0 - Preprocessing
。展開 Preprocessor Macros 并且為 Debug 和Release 添加一個變量。對于開發版 target(即 todo Test),設置變量的值為DEVELOPMENT=1
(校對注:等號兩邊不能有空格)。相對地,設置開發版 target 的值為 DEVELOPMENT=0。
其他版本同理 在開發中,就可以利用這個宏了,例如 :
#if DEVELOPMENT
// 這是正式版咯
#else
// 這是開發版咯
#endif
這里補充一種方法 ,
Xcode中可以利用Compiler Flags來設置宏
可以通過設置Compiler Flags來定義宏,然后就可以在代碼中使用這些宏,來進行條件編譯的操作。有三種方式設置:
// 在Target>Build Setting>Custom Compiler Flags>Other C Flags
OTHER_CFLAGS (Other C Flags)
// 在Target>Build Setting> Preprocessing > Preprocessor Macros
GCC_PREPROCESSOR_DEFINITIONS (Preprocessor Macros)
// 在Target>Build Setting> Packaging > Info.plist Preprocessor Definitions
INFOPLIST_PREPROCESSOR_DEFINITIONS (Info.plist Preprocessor Definitions)```

就像上圖 , 某個Target中設置了,這個宏, 后面我就用這個宏來判斷,究竟是哪個Target了.
// 同屬于生產環境
ifdef LIFEPROJECT
// 這里屬于life的
else
// 這里屬于不是life的
endif
##------一些注意事項 : ------##
1. 當為項目添加新文件時,不要忘記同時勾選多個 target 來保持各個 target 中的代碼一致。

2. 如果你的項目中使用了 Cocoapods,不要忘記在 podfile 中增加新的 target。我們可以使用 link_with
來指定多個 target。可以在 [Cocoapods 文檔中找到更詳細的內容](https://guides.cocoapods.org/) 。現在 Podfile 看起來應該是這樣的
xcodeproj '/Volumes/MYGIT/DY/DY/DY.xcodeproj'
platform :ios , ‘7.0’
workspace 'DY' // 這個
link_with 'DY', 'DYTest' // 這個
pod ‘AFNetworking’, ‘> 3.0’
pod 'Masonry', '0.5.3'
pod 'RDVTabBarController', '~> 1.1.9'
pod 'MBProgressHUD', '~> 0.9.2'
pod 'MJExtension', '~> 3.0.10'
pod 'MJRefresh', '~> 3.1.0'
pod 'SDWebImage', '~> 3.7.5'
3.
如果使用了持續集成系統,比如 [Travis CI](https://travis-ci.org/) 或 [Jenkins](https://jenkins-ci.org/) ,不要忘了每個 target 的構建和交付都要配置。