一:多target作用
首先看下蘋(píng)果官方對(duì)于target的定義
A target specifies a product to build and contains the instructions for
building the product from a set of files in a project or workspace. A
target defines a single product; it organizes the inputs into the build
system—the source files and instructions for processing those source
files—required to build that product. Projects can contain one or more
targets, each of which produces one product.
(它是一個(gè)項(xiàng)目環(huán)境的設(shè)置文件,一個(gè)Target定義了一個(gè)單一項(xiàng)目環(huán)境,
在一個(gè)項(xiàng)目工程中可以包含一個(gè)或者多個(gè)Target。也就是說(shuō)一個(gè)項(xiàng)目中可以設(shè)置多種環(huán)境。)
作用:
為了保證測(cè)試的一些垃圾數(shù)據(jù)不影響線上的版本數(shù)據(jù),此時(shí)就需要區(qū)分生產(chǎn)環(huán)境了,一般在測(cè)試的時(shí)候會(huì)專(zhuān)門(mén)為測(cè)試而準(zhǔn)備一個(gè)測(cè)試環(huán)境,而上線的時(shí)候?qū)y(cè)試環(huán)境改成對(duì)應(yīng)的線上環(huán)境以達(dá)到上線目的。
有可能有這種需求,一個(gè)app產(chǎn)品有兩個(gè)代理商。app的功能都一樣,除了公司logo以及內(nèi)部公司簡(jiǎn)介不同,產(chǎn)品的功能基本相同。這種情況下如果要是專(zhuān)門(mén)去獨(dú)立出來(lái)兩個(gè)項(xiàng)目,那以后迭代的話,兩個(gè)項(xiàng)目都得同時(shí)去迭代,工作量是如此浩大,而單一的去copy也不是設(shè)計(jì)中的一個(gè)好的方法。
所以為了解決這樣的問(wèn)題,我們可以通過(guò)使用今天所提到的方法,使用多個(gè)Target進(jìn)行項(xiàng)目的版本管理(測(cè)試版與線上版本等)。
二:使用
創(chuàng)建Target的方式有兩種:
方式一:直接copy之前項(xiàng)目中的Target配置;
方式二:創(chuàng)建新的Target配置;
一般來(lái)講我們還是通過(guò)直接copy的方式來(lái)進(jìn)行多target開(kāi)發(fā)比較好。這樣原先項(xiàng)目中的一些基本配置會(huì)一同拷貝過(guò)來(lái)。
第一步:拷貝新的target包

第二步:給新target修改名稱(chēng)
直接點(diǎn)擊 Xcode的開(kāi)發(fā)版 copy 給其修改名稱(chēng),這里我們修改為Xcode的發(fā)布版

修改后如下:

但是當(dāng)你點(diǎn)擊
運(yùn)行按鈕邊上的schema時(shí)會(huì)發(fā)現(xiàn)scheme的名稱(chēng)還是沒(méi)有變化,

這時(shí)候順序點(diǎn)擊 schema -> Manage schemas ... 點(diǎn)擊下面的名稱(chēng),直接輸入新的名稱(chēng)。

第三步:修改plist文件。
經(jīng)過(guò)第一步copy之后,你會(huì)發(fā)現(xiàn)項(xiàng)目最底部多出來(lái)一個(gè)plist文件。
這個(gè)就是你新的target的plist文件了。通過(guò)對(duì)他進(jìn)行修改就可以app應(yīng)用的名稱(chēng)了。如果你的app進(jìn)行了國(guó)際化,也沒(méi)關(guān)系,你可以在項(xiàng)目中新建一個(gè)目錄專(zhuān)門(mén)用來(lái)存放新的target的相關(guān)資源。拷貝InfoPlist.string文件到新的目錄中。注意復(fù)制是該InfoPlist.string只添加到新到target.

第四步:修改應(yīng)用圖標(biāo)
4.1 新建一個(gè)AppIcon

4.2 新的target的appicon更換為新的appicon

第五步:配置全局宏,目的是在代碼中進(jìn)行環(huán)境的區(qū)分
Target 開(kāi)發(fā)版->Build Settings然后搜索Preprocessor Macros然后增加宏

在oc中的預(yù)編譯宏可以這么使用。但是swift中還需要額外增加一個(gè)配置。
Target 發(fā)布版->Build Settings 搜索 swift flags

然后利用如下代碼可以區(qū)分是開(kāi)發(fā)版本還是發(fā)布版本
override func viewDidLoad() {
super.viewDidLoad()
let ViewHeight:CGFloat = 100
let ViewWidth:CGFloat = 100
let ScreenWidth:CGFloat = UIScreen.main.bounds.width
let ScreenHeight:CGFloat = UIScreen.main.bounds.height
// 開(kāi)發(fā)版本的view
let developView = UIView(frame: CGRect(x:(ScreenWidth - ViewWidth) / 2 , y:(ScreenHeight - ViewHeight) / 2 , width:ViewWidth, height:ViewHeight))
developView.backgroundColor = UIColor.red
// 發(fā)布版本的view
let distributeView = UIView(frame: CGRect(x:(ScreenWidth - ViewWidth) / 2 , y:(ScreenHeight - ViewHeight) / 2 , width:ViewWidth, height:ViewHeight))
distributeView.backgroundColor = UIColor.blue
// 判斷
#if DISTRIBUTE
view.addSubview(distributeView)
#else
view.addSubview(developView)
#endif
}
運(yùn)行后截圖如下:


方式二:新建一個(gè)target與新建一個(gè)項(xiàng)目到過(guò)程相同。
1393878-145a0048aede92a6.gif

注意
新增文件、資源等,如果有多個(gè)Target,添加新文件時(shí)要注意勾選多個(gè)Target

三:多target下cocoapods的使用。
相信很多時(shí)候我們的項(xiàng)目離不開(kāi)pods的框架管理,在使用cocopods管理的時(shí)候,我們不要忘了將這些框架添加到對(duì)應(yīng)的Target中。但是這時(shí)候會(huì)出現(xiàn)一個(gè)比較難受的問(wèn)題,如果我的項(xiàng)目有四個(gè)甚至更多個(gè)target。那么我增加一個(gè)或者刪除一個(gè)三方庫(kù)的話就會(huì)有多次操作,存在許多重復(fù)代碼。這顯然不是我們想要的。怎么解決呢?
打開(kāi)Podfile文件。我們項(xiàng)目里現(xiàn)在有兩個(gè)target,假如我們集成了三個(gè)三方庫(kù)。這時(shí)候這種寫(xiě)法簡(jiǎn)直low爆了。怎么辦?
# Podfile
platform :ios, '9.0'
use_frameworks!
# My other pods
target 'Xcode的發(fā)布版' do
pod 'TSVoiceConverter', '0.1.3'
pod 'UIColor_Hex_Swift', '~> 3.0.2'
pod 'RxCocoa', '~> 3.0'
end
target 'Xcode的開(kāi)發(fā)版' do
pod 'TSVoiceConverter', '0.1.3'
pod 'UIColor_Hex_Swift', '~> 3.0.2'
pod 'RxCocoa', '~> 3.0'
end
改成下面這種就好了
# Podfile
platform :ios, '9.0'
use_frameworks!
# My other pods
def all_Pods
pod 'TSVoiceConverter', '0.1.3'
pod 'UIColor_Hex_Swift', '~> 3.0.2'
pod 'RxCocoa', '~> 3.0'
end
target 'Xcode的開(kāi)發(fā)版' do
all_Pods
end
target 'Xcode的發(fā)布版' do
all_Pods
end
完美?。。。?/p>