[Xcode]同一項(xiàng)目(Project)創(chuàng)建多個(gè)Target

在項(xiàng)目開發(fā)中,難免會(huì)遇到要同時(shí)維護(hù)多個(gè)app的情況,而如果這幾個(gè)app有很大一部分的重復(fù)內(nèi)容,其最好的解決方式,就是在同一個(gè)項(xiàng)目中設(shè)置不同的Target,這樣既可以復(fù)用大部分的文件內(nèi)容,又能針對(duì)不同的項(xiàng)目需求來進(jìn)行個(gè)性化設(shè)置。以下就是基于這個(gè)需求來進(jìn)行多個(gè)Target的設(shè)置。

1. 創(chuàng)建新的Target

創(chuàng)建新的Target有兩種方式,一個(gè)是新建,一個(gè)是復(fù)制原有的Target;
為了區(qū)分兩種方式的區(qū)別,項(xiàng)目初始為:


紅框內(nèi)為新添加的幾個(gè)文件;

1.1. 新建Target

同新建項(xiàng)目一樣,選擇頂部菜單欄:File ->New -> Target...

屏幕快照 2018-06-12 下午2.22.11.png

在彈出的頁面填寫新的Target名稱即可:


這樣創(chuàng)建的Target會(huì)有單獨(dú)的AppDelegate,而且會(huì)有單獨(dú)的文件分類:

紅框內(nèi)為原有的文件,綠框內(nèi)為新創(chuàng)建的Target文件;

這種方式創(chuàng)建的Target很多文件不能共用,但也有一些好處:獨(dú)立的AppDelegate,不需要對(duì)新的Target進(jìn)行配置,即可直接使用;

一般我們使用下面的方法進(jìn)行復(fù)制一個(gè)Target,以達(dá)到共用文件的目的;

1.2 方式二:復(fù)制Target

選中需要復(fù)制的Target,然后右鍵選擇 Duplicate,即可直接復(fù)制

復(fù)制之后的名稱為:“愿名稱 copy”;這里既是:“TargetTest copy”;另外在左側(cè)文件列表會(huì)多出一個(gè)xxx-info.plist文件,即下圖紅框內(nèi)文件:

這樣創(chuàng)建的Target需要我們進(jìn)行一些設(shè)置,重命名等!

修改Target名稱

選中新的Target之后,再次單擊,即可修改名稱:

修改Bundle id

這時(shí)的Bundle Identifier和Display Name還是原先的Target名稱,選中新的Target后,會(huì)顯示新的Target配置文件,設(shè)置新的id和名稱即可:

修改Scheme

此時(shí)的Scheme還是 TargetTest copy ,需要修改為和新的Target同名的:

在打開的頁面中選中需要修改的Target后,再次點(diǎn)擊即可進(jìn)入編輯狀態(tài):

修改xxx-info.plist文件名稱

默認(rèn)生成的xxx-info.plist文件名稱是TargetTest copy-Info.plist,當(dāng)然,我們需要把它修改為和之前一致的,直接修改即可(建議保留如下格式):

修改之后,我們需要重新配置一下其路徑,最簡(jiǎn)單的方式是,先將該文件刪除引用,然后再添加進(jìn)來:

然后在彈出頁中選擇 Remove Reference:

然后,再右鍵-> Add File to...,重新添加進(jìn)來即可!

如果,我們需要區(qū)分的文件比較多,建議新建一個(gè)文件夾,然后將該plist文件移動(dòng)到文件夾中:


接著Add File to...:


上面選中要添加的文件,最下面勾選要添加到的Target,其實(shí)這里只需要勾選First Target即可,因?yàn)槲覀円砑拥奈募褪堑竭@個(gè)Target的,也可以勾選所有的Target;

配置info.plist文件路徑

上面添加完info.plist文件后是這樣的:

可以看到,右側(cè)選中新的Target(FirstTarget)后, Identity 項(xiàng)是空著的。點(diǎn)擊 Choose Info.plist File... 選擇剛剛添加的Info.plist即可:


然后先選擇一下其他的Target,再選擇新添加的Target就會(huì)顯示剛剛新加的Info.plist文件:


設(shè)置宏定義

由于設(shè)置了不同的Target,在我們編寫代碼的時(shí)候就需要知道哪個(gè)Target引用了哪個(gè)文件,在不同的Target中配置不同的參數(shù)等;這就需要設(shè)置用于區(qū)分對(duì)應(yīng)Target的宏定義:Target -> Build Settings -> 搜索 macros

在 Preprocessor Macros 中可以分別設(shè)置 Debug模式和Release模式下的全局宏定義,一般是添加的一樣的;在右邊空白處雙擊可以彈出下面的視圖:

點(diǎn)擊左下角 + 可以新加宏定義

PS: 如果需要修改原有的宏定義,選中后,再次單擊,即可進(jìn)行編輯;如果需要?jiǎng)h除,選中后,點(diǎn)擊左下角的 - 即可刪除;

設(shè)置完之后是這樣的:


在使用的時(shí)候,我們既可以在代碼中使用if判斷,也可以在頭文件中使用#if #endif判斷:

例如,根據(jù)該宏引入不同的頭文件,可以這樣寫:

#if FIRST_FLAG
#import "FirstUserModel.h"

#else
#import "UserModel.h"

#endif

在代碼中可以這樣使用:

if (FIRST_FLAG) {
        NSLog(@"FirstTarget log");
    } else {
         NSLog(@"log");
    }

如果有多個(gè)Target,既可以使用這個(gè)方式進(jìn)行區(qū)分!

PS:如果需要在多個(gè)Target中使用同一個(gè)宏定義進(jìn)行判斷,可以在每個(gè)Target中都添加相應(yīng)的宏,只不過修改其值即可,例如上面的如果想在原Target中使用FIRST_FLAG宏,可以在原Target中這樣設(shè)置:


Swift項(xiàng)目設(shè)置標(biāo)識(shí)符

在swift項(xiàng)目中沒有宏定義的概念,也不能使用宏定義。Swift中對(duì)應(yīng)OC中的宏定義有個(gè)flag(標(biāo)識(shí)符)可供我們使用,在Build Setting中搜索:other swift flags

在右邊空白處雙擊,即可彈出和OC一樣的彈框,點(diǎn)擊 + 添加即可!

PS:需要注意,這里添加標(biāo)識(shí)的時(shí)候,需要在你自定義的標(biāo)識(shí)符前加 “-D”;例如你的標(biāo)識(shí)符為:MYFLAG,那么添加的時(shí)候要是:-DMYFLAG,而且不能像OC那樣進(jìn)行賦值。

設(shè)置完成后,即:

使用:

#if MYFLAG
print("自定義的Flag")
#endif

圖片資源 Assets.xcassets

Assets的使用可以共用一個(gè),也可以新建一個(gè)Assets,以供給不同的Target使用:

共用一個(gè)Assets

共用一個(gè)Assets的好處是,大部分的圖標(biāo)都可以進(jìn)行復(fù)用,不需要額外拖入,這里主要是將如何設(shè)置不同的啟動(dòng)圖和 App icon,如何不加載不需要的圖標(biāo):
設(shè)置不同的App icon
點(diǎn)擊右下方 + 選擇新的icon或者launch image:

然后,加入相應(yīng)的icon圖標(biāo);
最后,將新的icon設(shè)置為新的Target的圖標(biāo)即可;
在TARGETS中選擇你的Target -> General -> App Icons and Launch Images中 App Icons Source 引用到新建的那個(gè)icon即可:

設(shè)置不同的Launch Image
和設(shè)置不同的icon大致相同,新建一個(gè)Launch Image Asset,然后加入相應(yīng)的啟動(dòng)圖,最后再設(shè)置為新的Target的啟動(dòng)圖即可!

只加載需要的圖標(biāo)
不同的項(xiàng)目使用的圖標(biāo)資源會(huì)有區(qū)別,如果復(fù)用了大部分的圖標(biāo),而不想在編譯的時(shí)候引入未使用的別的Target的圖標(biāo),可以在相應(yīng)的Target中的Build Phases下的 Copy Bundle Resources 中刪除不需要圖標(biāo)的引用即可!

PS:同樣,Build Phases下的Comolle Sources中也可以刪除不需要的.m文件的引用!

新建不同的Assets

同新建文件一樣,右鍵 -> New File...

在Resource中選擇 Asset Catalog,Next,起一個(gè)文件名,選擇相應(yīng)的Target:

拖入藥添加的圖片,配置相應(yīng)的icon和啟動(dòng)圖即可!

PCH文件

如果原Target有PCH文件,復(fù)制新的Target的時(shí)候,默認(rèn)是一起復(fù)制了的,如果需要添加新的PCH文件,可以新建之后,在 Building Setting中搜索:“prefix header”,將路徑添加進(jìn)去即可!

Podfile文件配置

如果項(xiàng)目中使用了Pod進(jìn)行第三方庫的項(xiàng)目管理,需要針對(duì)新的Target進(jìn)行一些第三方庫的支持,否則,在不同的Target進(jìn)行編譯工程的時(shí)候,可能會(huì)報(bào)找不到頭文件的錯(cuò)誤;只需要在原Podfile文件中添加一個(gè)“Target - do - end ” 即可:
例如,原Podfile文件如下:

# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'

target 'TargetTest' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!

  # Pods for TargetTest
  pod 'AFNetworking', '~> 3.1.0'
 pod 'Masonry', '~> 1.1.0'
  pod 'MBProgressHUD', '~> 1.1.0'

  target 'TargetTestTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'TargetTestUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end

修改之后的如下:

# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'

target 'TargetTest' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!

  # Pods for TargetTest
  pod 'AFNetworking', '~> 3.1.0'
 pod 'Masonry', '~> 1.1.0'
  pod 'MBProgressHUD', '~> 1.1.0'

target 'FirstTarget' do
    # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
    # use_frameworks!
    
    # Pods for FirstTarget
    pod 'AFNetworking', '~> 3.1.0'
    pod 'Masonry', '~> 1.1.0'
    pod 'MBProgressHUD', '~> 1.1.0'
    
end

  target 'TargetTestTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'TargetTestUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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