XCode工程中Targets詳解

XCode工程中Targets講解是本文要介紹的內容,相信很多人都注意到XCode中,有個Target的概念。這在很多地方都有所體現,比如打開一個工程後,左側的列表中有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對應一個新的product(基於同一份代碼的情況下)。但都一份代碼了,弄個新product做啥呢?折騰這個有意思麼?


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

相同。


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

喂,你在教些什麼…)


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


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

從XCode左側的列表中,我們可以看到一個Target包含了Copy Bundle Resources,CompileSources,LinkBinaryWithLibraries.

其中CopyBundleResources是指生成的product的,app內將包含哪些資源文件。

CompileSources是指將有哪些源代碼被編譯。

LinkBinaryWithLibraries是指編譯過程中會引用哪些庫文件。


通過CopyBundleResources中內容的不同設置,我們可以讓不同的product包含不同的資源,包括程序的主圖標等,而不是把XCode的工程中列出的資源一股腦的包含進去。而這還不是一個target所指定的全部內容。每個target可以使用一個獨立,不同的Info.plist文件。


我們都知道,這個Info.plist文件內定義了一個iPhone項目的很多關鍵性內容,比如程序名稱,最終生成product的全局唯一id等等。而且不同的target還可以定義完整的差異化的編譯設置,從簡單的調整優化選項,到增加條件編譯所使用的編譯條件,以至於所使用的baseSDK都可以差異化指定。


創建第二個Target

爲什麼是第二個?因爲第一個就是創建好工程後的默認Target呀!(廢話這麼多,拖走…)


創建target有多種方法,我們可以從現有的target上複製出一份,然後略加改動,也可以完全新建一個target出來。但其實說穿了,兩個方法大同小異。

首先我們來看看利用複製的方法創建target利用複製創建target。

我們在XCode左側的列表中,展開Targets 項,在現有的target上,右鍵選擇“Duplicate”,或者選中現有target後,在頂部菜單的Edit內選擇“Duplicate”也可以。此 時 我 們 就 得 到 了 一 個 新 的target, 而 在Resource裏 面 也 會 得 到 一 個xxxxcopy.plist.這個新的target與原有的target是完全一致的,餘下的就是一些差異化的修改,這個我們後面再說。


創建全新的target
類似複製的方法,我們可以在左側的列表中很多地方按下右鍵菜單,都可以看到Add中會有“NewTarget…”一項,而在工程頂部菜單的Project內,也可以看到這個“New

Target…”的身影。點擊後,首先會讓你選擇target的類型,既然我一直所指的都是程序本身,那麼自然選擇Application了(至於其他的嘛,有興趣的自己研究吧,比如我們可以把程序中的部分提取成一個StaticLibrary)。Next後,會讓你輸入一個新的Target的名字,而不像複製的方法中,默認生成xxxxxcopy這樣的target名。


但是這樣生成出的Target幾乎是空的。Copy Bundle Resources, Compile Sources,LinkBinaryWithLibraries裏面都沒有任何內容。編譯設置也是完全原始的狀態。可以通過拖拽內容到這些target的設置中,以及調整編譯選項來完成Target的配置。


Target中部分內容的修改方法

其實這段的部分內容,在非多Targets的工程中也可能會用得到。由於修改基本都是在工程/編譯設置中完成,因此沒有特殊情況,就不再聲明瞭,打開target對應的工程/編譯設置的方法可以採用在該target上右鍵,選擇getinfo來做到。


生成的product名稱的修改:Packing段內的ProductName一項
Info.plist文件名:Packing段內的Info.plist File一項,比如複製出來的target。覺得那個xxxxxcopy.plist太傻就可以在這裏改
條件編譯:增加一個User-DefinedSetting(Target“xxxx”Info的build頁的左下角那個齒輪中可以看到這個內容),在Other C Flag裏面填入,比如要定義一個叫做LITE_VERSION的define值,我們可以寫上“-DLITE_VERSION”或“-DLITE_VERSION=1”.

那麼在程序中就可以用


#ifdefined(LITE_VERSION)

#else

#endif


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


也許有些朋友記得我在代碼區貼過的檢測破解版的代碼,其中有一種檢測方法就是看info.plist是文本還是二進制的,那麼我們能否建議一個模擬破解的target,直接生成文

本的info.plist以便測試呢?


當然可以,在packing段內,有一項叫“Info.plistOutputEncoding”,默認值是Binary,我們只要選成xml,那麼生成出的product.app內的info.plist就直接是文本樣式的了。


另外,向CopyBundleResources,CompileSources,LinkBinaryWithLibraries內添加/刪除文件,可以在要改動的文件上,選擇getinfo,並且切換到Target頁,勾選要引用這個文件的target即可。比如icon.png可以指定給默認target,而icon_lite.png指定給liteverion的target。


小結:XCode工程中Targets講解的內容介紹完了,希望本文對你有所幫助!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章