一項,而在工程界面的頂部菜單中,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做啥呢?折騰這個有意思麼?
相同。
喂,你在教些什麼…)
要解釋這個問題,我們就要來看看一個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是完全一致的,餘下的就是一些差異化的修改,這個我們後面再說。
類似複製的方法,我們可以在左側的列表中很多地方按下右鍵菜單,都可以看到Add中會有“NewTarget…”一項,而在工程頂部菜單的Project內,也可以看到這個“New
Target…”的身影。點擊後,首先會讓你選擇target的類型,既然我一直所指的都是程序本身,那麼自然選擇Application了(至於其他的嘛,有興趣的自己研究吧,比如我們可以把程序中的部分提取成一個StaticLibrary)。Next後,會讓你輸入一個新的Target的名字,而不像複製的方法中,默認生成xxxxxcopy這樣的target名。
但是這樣生成出的Target幾乎是空的。Copy Bundle Resources, Compile Sources,LinkBinaryWithLibraries裏面都沒有任何內容。編譯設置也是完全原始的狀態。可以通過拖拽內容到這些target的設置中,以及調整編譯選項來完成Target的配置。
其實這段的部分內容,在非多Targets的工程中也可能會用得到。由於修改基本都是在工程/編譯設置中完成,因此沒有特殊情況,就不再聲明瞭,打開target對應的工程/編譯設置的方法可以採用在該target上右鍵,選擇getinfo來做到。
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”.
那麼在程序中就可以用
#else
#endif
這樣的條件編譯來部分差異化代碼了
本的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。