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

原博文地址:http://blog.csdn.net/lxl_815520/article/details/51004463


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,Target,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可以根據具體需要增減裏面的內容


發佈了47 篇原創文章 · 獲贊 16 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章