一:Xcode 環境簡介html
首先弄清楚一些在XCode環境下的一些概念:ios
Workspace:
簡單來講,Workspace就是一個容器,在該容器中能夠存放多個你建立的Xcode Project, 以及其餘的項目中須要使用到的文件。xcode
使用Workspace的好處有:
1),擴展項目的可視域,便可以在多個項目之間跳轉,重構,一個項目可使用另外一個項目的輸 出。Workspace會負責各個Project之間提供各類相互依賴的關係;
2),多個項目之間共享Build目錄。app
Project:
指一個項目,該項目會負責管理生成一個或者多個軟件產品的所有文件和配置,一個Project能夠包含多個Target。ide
Target:
一個Target是指在一個Project中構建的一個產品,它包含了構建該產品的全部文件,以及如何構建該產品的配置。工具
Scheme:
一個定義好構建過程的Target成爲一個Scheme。可在Scheme中定義的Target的構建過程有:Build/Run/Test/Profile/Analyze/Archiveui
BuildSetting:
配置產品的Build設置,比方說,使用哪一個Architectures?使用哪一個版本的SDK?。在Xcode Project中,有Project級別的Build Setting,也有Target級別的Build Setting。Build一個產品時必定是針對某個Target的,所以,XCode中老是優先選擇Target的Build Setting,若是Target沒有配置,則會使用Project的Build Setting。spa
關於如何構建以上環境,請參考devCenter官方指南:.net
https://developer.apple.com/library/ios/recipes/xcode_help-structure_navigator/articles/Adding_an_Existing_Project_to_a_Workspace.html命令行
二:Xcode 建立workspace多工程依賴
新建 Xcode workspace
打開 Xcode , 選擇 File -> New -> Workspace , 將 Workspace 命名爲 Test.xcworkspace , 並選擇合適的目錄。
三:Xcode 建立子工程以及工程依賴
背景:因爲建立一個app的時候須要引入大量的依賴三方庫或者本身寫的工具類,每次新建app這些事情都須要大量的時間。因此,就考慮建一個公共工程,每次新建項目,只是須要依賴這個工程就好了。
思路設計:①BaseApp,用於存放公共的庫。②BaseAppSample用於寫demo和示例,方面別人在使用的時候查看和借鑑。
具體步驟:
一、建立BaseApp工程,注意這裏被依賴的工程要是Static Library。
二、建立BaseAppSample工程。在BaseAppSample的framework group上面右鍵,添加文件,選中BaseApp.xcodeproj,創建依賴關係。
行成如上圖所示的依賴關係。
三、這樣BaseAppSample裏面就可使用BaseApp裏面的類了麼?開始我覺得能夠了,但是我錯了。在BaseAppSample裏面import相關的類會出現找不到的error,會編譯錯誤。須要進行下面的操做:
在Header Search Paths 裏面添加引入頭文件的路徑,如上所示,這樣就不會出現編譯的error了。
四、等等,好像覺得正確,comand + r。Oh,NO,仍是有錯誤。仍是編譯還出現找不到相關的文件。
這個時候能夠判斷的是,編譯的結果沒有可以正確的依賴,進行下面的步驟
添加target的依賴關係,保證編譯BaseAppSample的時候先編譯BaseApp。
選中BaseAppSample Target,而後選中其Build phases選項,添加BaseApp target
而後把lib也引入依賴中,以下所示:
五、若是被依賴包(BaseApp)中有圖片或者依賴文件怎麼辦?
要把相關的依賴圖片copy出去:選中BaseApp target,進入Build phases選項,找到最下面的copy file欄,添加相關的文件:
到這一步,只要command+r,BaseAppSample中就可以正常地引入BaseApp裏面的功能了。
之後有公共的組件,只是須要添加到BaseApp中,其餘依賴的功能都可以使用了。
爲了維護方便,能夠把BaseApp用單獨的SVN或者Git來維護。
分割線追加:
————————————————————————————————————————
今天右發現新的問題,若是存在category的時候,使用category會致使Crash
解決辦法是在Sample裏面添加編譯的命令:
在Other Linker Flags添加 -Objc和-all_load選項,保證category可以被正常的引入。
原文地址:http://www.ganlvji.com/?p=128
四:在Xcode中添加多個targets
(轉載地址: http://blog.csdn.net/ysysbaobei/article/details/10951991)
在ios開發時,咱們常常會遇到對同一個app開發多個版本(Pro、Lite、Free)的狀況,這裏就涉及到xcode裏經過添加多個targets來進行版本控制的問題了,下面就簡單說明一下:
點擊左側的工程名稱,右側會出現PROJECT和TARGETS,點擊你如今的target,假如叫A,右鍵彈出菜單中,選擇Duplicate,複製一 個相同的target,複製的target通常叫A copy,A copy和A的設置(編譯條件、源文件、資源文件)徹底同樣,此時你能夠根據須要修改A copy的編譯條件和資源文件了;
一、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
--源文:https://developer.apple.com/library/ios/featuredarticles/XcodeConcepts/Concept-Targets.html
一個Target肯定了一個product to build,包括一些instruction(怎麼從一個project或者workspace的一堆文件導出一個產品)。一個Target對應一個 product,它管理着一個product的build system的「輸入」(一堆源文件和一些處理這些源文件的instruction)。一個project能夠包含多個target,每個targe生 成一個product。
構建一個product的instruction表現形式是build settings and build phases(能夠在Xcode Project editor裏面查看、編輯)。一個Target的build settings 繼承project的build settings,可是重寫覆蓋project setting。同一時間裏只有一個active Target ,由Xcode Scheme指定。
一 個Target和它的product能夠和其餘Target聯繫,若是一個target build須要另外一個target的「輸出」,能夠說成第一個target依賴第二個。若是這倆個target在同一個workspace,Xcode會 發現他們的依賴關係,從而build the products按照特定的順序。這樣的關係被稱爲「 implicit dependency.」 你也能夠爲倆個targets指定明確的target 依賴關係在build setting裏面。例如,你可能build一個library和一個連接這個library的application(同一個workspace)。 Xcode能夠發現這種關係而且自動build這個library first。然而,你若是要去連接library的某個版本而不是one built in the workspace,你能夠在build settings裏建立一個肯定的依賴關係,它將會覆蓋implicit dependency。
一個project是全部文件、資源、信息/配置的repository。一個project包含全部build your products所需的內容而且維護他們之間關係。它能夠包含多個targets。一個project爲全部的target定義默認的build setting(每個target能夠自定義它們的build setting,這些自定義的setting會覆蓋project默認的build setting)。
一個project包含以下信息:
--相關源文件:1. 源代碼,.h和.m; 2. library和frameworks(內部和外部) 3. 資源文件 4.IB 文件
--在structure navigator組織source files的Groups;
--Project-level build configuration,能夠有多個,例如debug和release buid setting;
--Target:即,相應的products、source files、build configuration(包括dependencies on other targets and other setting,project-level setting會被用到當 targets’ build configurations do not override them);
--用來debug和test程序的可執行環境,包括:What executable to launch when you run or debug from Xcode;命令行參數to be passed to the executable, if any;Environmental variables to be set when the program runs, if any。
一個project能夠單獨存在,也能夠包含在一個workspace裏。
使用Xcode scheme去指定哪一個target,building configuration,executable configuration是active(當前)的。
a build Setting是一個變量,包含着怎麼build product的處理信息。例如,Xcode傳給編譯器的選項。
build settings有project level和target level倆中級別。project-level中的build setting適用項目中全部的targets,只要該build setting沒有被相應的target重寫。
每個target管理着build one product的source files。一個build 設置包含一系列build 特定product 的build settings。例如,一般有debug 和release倆中分開的build 設置。
一個build setting在Xcode中的包含倆部分:setting title 和 definition。前者標示着該build setting而且可被用在其餘的settings。後者是一個常量或者一個表達式,肯定了build setting的值。一個build setting可能也有一個顯示名稱,在Xcode界面中顯示build setting。
另外,當你選擇某個project template建立一個新的project,default build setting也相應的由Xcode生成了,你也能夠爲project或者某個target建立自定義build settings。一個conditional build setting的值取決於它的先決條件有沒有被知足。這種機制容許你,例如,根據targeted architecture肯定build a product的sdk。
------Workspaces Extend the Scope of Your Workflow
一個workspace是一個Xcode 文檔,groups(組合)不一樣的project、文檔,因此你能夠同時管理多個project。一個workspace能夠包含任意個Xcode project和別的文件。另外它管理着全部的文件,project和targets在一個workspace中能夠有implicit和 explicit 倆種relationships。
一個工程文件(project fiel)包含着指向project中其餘全部文件、building configuration、其餘project信息的指針。在Xcode 3之前,工程文件是root of the group 和file structure hierarchy。儘管一個project能夠和其餘project聯繫,可是相關項目一塊兒工做還會比較困難。大部分的工做都是侷限在一個 project中。在Xcode 4之後,你能夠建立一個workspace去包含多個project及相關文件。
另外提供對每一個project全部文件的訪問,workspace拓展了許多Xcode workflows工做範圍。例如,because indexing在整個workspace裏面作索引,code completion、Jump to Definition以及一些其餘功能都是針對着整個workspace。由於refactoring operations在整個workspace工做,你能夠refactor API在一個framework project,而且在其餘的application projects用它的framework in one operation。當building時候,一個project能夠適用workspace中其餘project的products。
workspace document包含着指向included projects 和其餘files的指針,可是沒有其餘數據。一個project能夠屬於多個workspace。下圖顯示一個workspace包含倆個Xcode project (添加的.xcodeproj到workspace)加上一個document project(添加的文件夾到workspace)。
備註:workspace相似.xcodeproj文件,他不是一個文件夾,而是一個有管理、索引做用的一個文件。
------Projects in a Workspace Share a Build Directory
默認狀況下,全部的workspace中的Xcode projects are built 在同一個目錄下,簡稱workspace build directory。 每個workspace有 它本身的build directory。由於全部projects中的文件是同一個build directory,全部這些文件對每一個project都是可見的,因此,若是有多個project用同一個libraries,你不須要單獨copy它 們到每個project文件夾中。
Xcode會 檢查build directory中的文件去發現它們implicit dependencies。例如,一個workspace中的project build了一個library,這個library被workspace中另外一個project引用,Xcode會自動先build the library而後build the project,即便build configuration中沒有明顯的設置。若是須要的話,你能夠用explicit build settings重寫implicit dependencies。對於「顯示依賴」(explicit dependencies),你必須建立項目引用。
workspace中的projcet仍然保持着本身的特性。一個project是單獨工做仍是跟workspace中其餘project有聯繫工做能夠經過不一樣的打開方式,在workspace中打開仍是在project中打開。由於一個project屬於多個workspace,你能夠隨意添加多個projects,而不須要從新建立project或者workspace。
你可使用workspace默認的build directory,也能夠本身指定一個。請注意,若是一個project指定了一個build directory,這個目錄會被它所在的workspace build directory重寫,當你build the project。
一個Xcode Scheme 定義了a collection of targets to build,a configuration to use when building, and a collection of tests to execute。
(備註:這個定義感受挺準確:A scheme is a collection of settings that specify which targets to build, what build configuration to use(not the build setting), and the executable environment to use when the product specified by the target is launched。<Scheme Configuration Help>)
你能夠有許多scheme,可是同一時間只能是激活的。你能夠指定是否一個scheme存儲在project裏,這樣每個包含他的workspace都 能看到它或者只能看某一個workspace中看到。當你選擇一個激活的shceme,你也須要選擇一個運行目標(設備)。
------------------------
ps:compile、build、execute區別:編譯 + 鏈接/生成,目標是生成可執行Exe文件 + 執行。