iOS 多target 解決方案

一:多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.gif
第二步:給新target修改名稱(chēng)

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


Snip20171110_2.png

修改后如下:
Snip20171110_6.png

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

這時(shí)候順序點(diǎn)擊 schema -> Manage schemas ... 點(diǎn)擊下面的名稱(chēng),直接輸入新的名稱(chēng)。
Snip20171110_7.png
第三步:修改plist文件。

經(jīng)過(guò)第一步copy之后,你會(huì)發(fā)現(xiàn)項(xiàng)目最底部多出來(lái)一個(gè)plist文件。
Snip20171110_8.png

這個(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.

修改后目錄結(jié)構(gòu)如下。
Snip20171110_9.png
第四步:修改應(yīng)用圖標(biāo)
4.1 新建一個(gè)AppIcon
Snip20171110_12.png
4.2 新的target的appicon更換為新的appicon
Snip20171110_13.png
第五步:配置全局宏,目的是在代碼中進(jìn)行環(huán)境的區(qū)分

Target 開(kāi)發(fā)版->Build Settings然后搜索Preprocessor Macros然后增加宏


引用了另一位仁兄的圖片.gif

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


Snip20171110_15.png

然后利用如下代碼可以區(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)行后截圖如下:


發(fā)布版本.png

開(kāi)發(fā)版本.png

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

注意

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


Snip20171110_10.png

三:多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>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,741評(píng)論 25 709
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • 前言 在公司發(fā)展過(guò)程中,除了開(kāi)發(fā)維護(hù)自有品牌外,針對(duì)有實(shí)力有潛質(zhì)的客戶(hù),公司還會(huì)接受OEM「貼牌開(kāi)發(fā)」的合作方式。...
    ChamchamBen閱讀 3,147評(píng)論 9 7
  • 放棄那些無(wú)用無(wú)效的社交, 提升自己,才能讓世界變得更大。 我們總是去參加社交,卻不知道,很多社交其實(shí)并沒(méi)有什么用,...
    大菠蘿Pinery閱讀 700評(píng)論 0 1
  • 一.思路 隱藏css默認(rèn)的checkbox的樣式 通過(guò)label的for屬性與input的id關(guān)聯(lián)后改變label...
    swhzzz閱讀 3,075評(píng)論 0 0

友情鏈接更多精彩內(nèi)容