iOS 單個project多個Target的使用

本文demo下載地址
**XCode工程中 Targets講解是本文要介紹的內容排吴,相信很多人都注意到XCode中, 有個Target的概念. 這在很多地方都有所體現(xiàn), 比如打開一個工程后, 左側的列表中有Targets一項, 而在工程界面的頂部菜單中, project里面也有多個涉及到Target的項目, 那么這個Target到底是什么呢? **

Apple的人是這樣說的:

“ Targets that define the products to build. A target organizes the files and instructions needed to build a product into a sequence of build actions that can be taken.” 

一: target的作用

簡單的理解的話, 可以認為一個target對應一個新的product(基于同一份代碼的情況下). 但都一份代碼了, 弄個新product做啥呢? 折騰這個有意思么?

其實這不是單純的瞎折騰, 雖然代碼是同一份, 但編譯設置(比如編譯條件), 以及包含的資源文件卻可以有很大的差別. 于是即使同一份代碼, 產出的product也可能大不相同.

我們來舉幾個典型的應用多Targets的情況吧, 比如完整版和lite版; 比如同一個游戲的20關, 30關, 50關版; 再或者比如同一個游戲換些資源和名字就當新游戲賣的(喂喂, 你在教些什么...)

Targets之間, 什么相同, 什么不同

既然是利用同一份代碼產出不同的product, 那么到底不同Target之間存在著什么樣的差異呢?

要解釋這個問題, 我們就要來看看一個Target指定了哪些內容.

二:單個 target的設置

從XCode左側的列表中, 我們可以看到一個Target包含了
Copy Bundle Resources, Compile Sources, Link Binary With Libraries. 其中

Copy Bundle Resources 是指生成的product的.app內將包含哪些資源文件

Compile Sources 是指將有哪些源代碼被編譯

Link Binary With Libraries 是指編譯過程中會引用哪些庫文件

通過Copy Bundle Resources中內容的不同設置, 我們可以讓不同的product包含不同的資源, 包括程序的主圖標等, 而不是把XCode的工程中列出的資源一股腦的包含進去.

而這還不是一個target所指定的全部內容. 每個target可以使用一個獨立, 不同的Info.plist文件.

我們都知道, 這個Info.plist文件內定義了一個iPhone項目的很多關鍵性內容, 比如程序名稱, 最終生成product的全局唯一id等等.

而且不同的target還可以定義完整的差異化的編譯設置, 從簡單的調整優(yōu)化選項, 到增加條件編譯所使用的編譯條件, 以至于所使用的base SDK都可以差異化指定.

二:多個 target的設置

為什么是第二個? 因為第一個就是創(chuàng)建好工程后的默認Target呀! (廢話這么多, 拖走...)

創(chuàng)建target有多種方法, 我們可以從現(xiàn)有的target上復制出一份, 然后略加改動, 也可以完全新建一個target出來. 但其實說穿了, 兩個方法大同小異

首先我們來看看利用復制的方法創(chuàng)建target

利用復制創(chuàng)建target

我們在XCode左側的列表中, 展開 Targets 項, 在現(xiàn)有的target上, 右鍵選擇 "Duplicate", 或者選中現(xiàn)有target后, 在頂部菜單的Edit內選擇"Duplicate"也可以.

此時我們就得到了一個新的target, 而在Resource里面也會得到一個 xxxx copy.plist. 這個新的target與原有的target是完全一致的, 余下的就是一些差異化的修改, 這個我們后面再說

創(chuàng)建全新的target

類似復制的方法, 我們可以在左側的列表中很多地方按下右鍵菜單, 都可以看到Add中會有"New Target..."一項, 而在工程頂部菜單的Project內, 也可以看到這個"New Target..."的身影.

屏幕快照 2017-01-13 下午3.39.25.png

點擊后, 首先會讓你選擇target的類型, 既然我一直所指的都是程序本身, 那么自然選擇Application了(至于其他的嘛, 有興趣的自己研究吧, 比如我們可以把程序中的部分提取成一個Static Library).

屏幕快照 2017-01-13 下午3.40.03.png

Next后, 會讓你輸入一個新的Target的名字, 而不像復制的方法中, 默認生成 xxxxx copy這樣的target名.

但是這樣生成出的Target幾乎是空的. Copy Bundle Resources, Compile Sources, Link Binary With Libraries里面都沒有任何內容. 編譯設置也是完全原始的狀態(tài).

可以通過拖拽內容到這些target的設置中, 以及調整編譯選項來完成Target的配置。

Target中部分內容的修改方法

其實這段的部分內容, 在非多Targets的工程中也可能會用得到.
點擊info.plist在會顯示如下的圖片,比如復制出來的target覺得那個xxxxx copy.plist太傻就可以在這里改


屏幕快照 2017-01-13 下午3.42.36.png

條件編譯: 點擊需要設置的Target里面 ,如下圖的位置

屏幕快照 2017-01-13 下午4.04.12.png

在Other C Flag里面填入, 比如要定義一個叫做LITE_VERSION的define值, 我們可以寫上 "-DLITE_VERSION=0" 或 "-DLITE_VERSION=1". 那么在程序中就可以用

這一這里設置的-DLITE_VERSION=1相當于在對應的target的頭文件里面設置#define LITE_VERSION 1,-D 相當于#define的縮寫

    #if LITE_VERSION

    #else   

    #endif   

注意本demo這里的兩個target共用了一個viewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    ZHBlurtView *b = [[ZHBlurtView alloc] initWithFrame:self.view.frame WithHeaderImgHeight:200 iconHeight:100];
    
    UIView *vw = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds];
    vw.backgroundColor = [UIColor yellowColor];
        
       NSLog(@"%d",LITE_VERSION);
    
#if LITE_VERSION
    [self.view addSubview:b];
   
#else
    [self.view addSubview:vw];
#endif
        
}

Target BlurtViewTest的顯示效果

屏幕快照 2017-01-13 下午3.48.02.png

Target testTarget的顯示效果

屏幕快照 2017-01-13 下午3.51.18.png

這樣的條件編譯來部分差異化代碼了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末香追,一起剝皮案震驚了整個濱河市搜吧,隨后出現(xiàn)的幾起案子市俊,更是在濱河造成了極大的恐慌,老刑警劉巖滤奈,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摆昧,死亡現(xiàn)場離奇詭異,居然都是意外死亡蜒程,警方通過查閱死者的電腦和手機绅你,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昭躺,“玉大人勇吊,你說我怎么就攤上這事∏涎觯” “怎么了?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵礼殊,是天一觀的道長驹吮。 經常有香客問我,道長晶伦,這世上最難降的妖魔是什么碟狞? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮婚陪,結果婚禮上族沃,老公的妹妹穿的比我還像新娘。我一直安慰自己泌参,他們只是感情好脆淹,可當我...
    茶點故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沽一,像睡著了一般盖溺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铣缠,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天烘嘱,我揣著相機與錄音昆禽,去河邊找鬼。 笑死蝇庭,一個胖子當著我的面吹牛,可吹牛的內容都是我干的哮内。 我是一名探鬼主播盗棵,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼牍蜂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鲫竞?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤从绘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后僵井,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陕截,經...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年批什,在試婚紗的時候發(fā)現(xiàn)自己被綠了农曲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡驻债,死狀恐怖乳规,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情合呐,我是刑警寧澤暮的,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站淌实,受9級特大地震影響冻辩,放射性物質發(fā)生泄漏。R本人自食惡果不足惜拆祈,卻給世界環(huán)境...
    茶點故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一恨闪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧放坏,春花似錦凛剥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逻炊。三九已至,卻和暖如春犁享,著一層夾襖步出監(jiān)牢的瞬間余素,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工炊昆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桨吊,地道東北人。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓凤巨,卻偏偏與公主長得像视乐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子敢茁,可洞房花燭夜當晚...
    茶點故事閱讀 43,587評論 2 350

推薦閱讀更多精彩內容

  • 本文來自網絡摘取,作者不詳.侵刪. XCode工程中 Targets講解是本文要介紹的內容佑淀,相信很多人都注意到XC...
    Weelh閱讀 886評論 0 3
  • 【轉自:http://www.cocoachina.com/macdev/cocoa/2010/0120/347....
    leonbaichi閱讀 497評論 0 0
  • 因為要結局swift3.0中引用snapKit的問題,看到一篇介紹Xcode8,swift3變化的文章,覺得很詳細...
    uniapp閱讀 4,405評論 0 12
  • 背景介紹 開發(fā)過程中,我們會在內網搭建一個測試服務器彰檬,開發(fā)伸刃、測試都是在內網進行的。這樣產生臟數(shù)據(jù)不會影響外網的服務...
    ShanJiJi閱讀 14,737評論 8 29
  • 僅以方便自己查閱記錄前言1.靜態(tài)庫和動態(tài)庫有什么異同逢倍?靜態(tài)庫:鏈接時完整地拷貝至可執(zhí)行文件中捧颅,被多次使用就有多份冗...
    190CM閱讀 4,190評論 0 4