1. 程式人生 > >Xcode中同一Project建立多個target的總結

Xcode中同一Project建立多個target的總結

1.對Targets的理解

關於Targets,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對應一個新的product,管理著產品需要的檔案和指令序列

2.Project,Targethe Product三者的關係

網上有一句通俗的解釋,感覺挺好:"project就是一個專案,或者說工程,一個project可以對應多個target. 比如一個xxx遊戲的project,有free版的target,收費版的,或者還有什麼節日版,product就是target build出來的一個app" 


舉幾個典型的應用多Targets的例子, 比如完整版和lite版; 比如同一個遊戲的20關, 30關, 50關版等等.

3.Targets之間的差異性

既然是利用同一份程式碼產出不同的product, 那麼到底不同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還可以定義完整的差異化的編譯設定, 從簡單的調整優化選項, 到增加條件編譯所使用的編譯條件, 以至於所使用的base SDK都可以差異化指定.

4.建立target有兩種方式

1.是通過新建target可以通過File-->New-->Target,然後選擇其中一個模板來建立,app型別的target,可以選擇Empty Application模板,不過新建的target有自己的AppDelegate和main,這點還沒研究好,如何與原來的AppDelegate和main複用


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

   1>在原來的target上右鍵,選擇duplicate,Xcode會複製一個名為A copy的target物件,同時生成一個A copy-info.plist和A copy的scheme

   2>改名

     A copy的名稱是不是顯得不夠專業?現在來修改一下:

      1)首先修改Xcode左上角的target名稱:
           點選xcode左上角Run、Stop右邊的工程名稱,下拉框中選擇Manage Schemes,在彈出框中,點選A copy那行,點選一次、再點選一次,就可以修改A copy為你想要的名字了,比如ALite;
      2)修改xcode左下方Products下的A copy.app名稱:
點選Targets下你剛才改名後的ALite,點選Bulid Setting,搜尋Packaging下的Private Headers Folder Path,修改A copy.app/PrivateHeaders為:ALite.app/PrivateHeaders;

    修改Bundle Identifier和選擇不同的證書,讓app區分開來
     1)新target需要的.plist檔案
      新建一個資料夾X,新增X到專案中,新增時選擇target為ALite,不要選target A了,因為不是共用的;複製原來target的A-Info.plist到X,修改其名稱為ALite-Info.plist,xcode中右鍵Add File To ...,選擇新增到target ALite中;
     2)點選target: ALite ->Summary:提示你需要選擇plist檔案,選擇1)中新增的ALite-Info.plist;
     3)點選target: ALite ->Summary:設定Bundle Idenfitier;
     4)點選target: ALite->Build Settings->Code Signing:選擇另外的證書;
    修改程式名稱
     一般說來,多個target的程式名稱不同,複製zh-Hans.lproj和en.lproj下的InfoPlist.strings檔案到X,xcode中右鍵Add File To ...,選擇新增到target ALite中;然後修改InfoPlist.strings的內容:CFBundleDisplayName="程式名稱Lite";
 
    2個target到現在就建立好了,你新增資原始檔的時候,通過選擇新增的target來控制不同版本的內容;再說一下預編譯巨集的事情:target->Build Setting,搜尋:Preprocessor Macros,設定Debug和Release裡的預編譯巨集內容,比如TARGET_VERSION_LITE=1表示lite版本(注意=前後不能右空格,有空格會編譯不過),程式中對不同版本這樣判斷:
 
#if TARGET_VERSION_LITE ==1
...
 
#elif TARGET_VERSION_LITE ==2
...
 

#endif

其他:Build Phases(各target編譯所包含的內容,需要注意的是,如果建立了target B後,再往A裡面新增資源或檔案,target B中不會自動增加這些資源,需要手動新增)
1.Compile Sources

   需要編譯的程式碼檔案

2.Link Binary With Libraries

編譯所依賴的庫

3.Copy Bundle Resources

編譯需要的資源

每個target可以根據具體需要增減裡面的內容