咱們在iOS開發中可能會遇到同時開發多個相似項目的狀況。這些項目大同小異,有諸多代碼能夠共用,若是每一個項目都分別開發,這在後期的迭代中會十分繁瑣。爲了解決這個問題,使用多Target開發是一種比較好的選擇,本文就這一技術實現進行簡要總結。express
1、理解項目中的Porject與Targetui
使用Xcode來開發項目,其中的Project是一個總體項目至關於一個倉庫,包括了全部的代碼和資源文件。而Target至關於一個具體的產品,包含了對於代碼,資源文件的具體使用規則和配置。一個Project能夠包含多個Target,也就是說經過不一樣Target咱們能夠生成不一樣的APP。3d
2、多Target開發項目的實踐步驟code
使用多Target來建立項目,就以我當前正在開發的親戚買房APP爲例。需求是這樣的:親戚買房是一個爲買房人提供砍價服務的APP,APP的用戶須要區分爲用戶,專家和砍價師三個用戶羣體。因此這裏以Customer,Consul,Bargain三個Target來開發應用blog
以QQMF(親戚買房)爲名建立一個新的工程以下:token
建立三種Target資源
建立新Target的方式有兩種:開發
第一種:依次選擇File->New->Target,而後選擇一個模板(一般是Single View App)來建立。只是這樣建立的target帶有Appdelegate和main等文件,在這裏並不會用到這些文件,因此咱們採用第二種方式建立。get
第二種:產品
在Targets中點擊已有的Target,右鍵選擇Duplicate能夠複製生成一個copy的新Target,而且在文件目錄中生成對應的copy-Info.plist文件。這樣生成的target與被拷貝的target類似度很大,減小了過多的修改。一般爲了減小後期的修改,咱們也會首先在原有的Target中修改一些配置以後再Duplicate。
執行了Duplicate操做以後的效果以下:
1.修改Targe和plist文件的名稱爲本身須要的名稱
在Target裏能夠直接修改Target的名稱,在文件目錄下也能夠直接修改plist文件的名稱。若是咱們不想文件結構那麼亂,也能夠像其餘文件同樣移動plist文件的位置並從新引用到工程中,以下:
特別注意:咱們在移動文件的時候可能須要從新引用文件到工程中,此時add文件的時候必定要注意選擇Target,若是是共用文件必定要勾選對應的Target,相似AppDelegate這樣文件的操做以下:
2.修改Xcode左上角的Target名稱
選中Xcode左上角的建立工程時的Target(QQMF),選擇Manage schemes
在以下的schemes中修改Target的名稱,這裏也能夠刪除多餘的最初的QQMF
特別說明:QQMF是咱們建立工程自帶的Target,其實也能夠修改它的名字以供自定義使用,而這裏咱們是直接刪掉了它,這樣以後,項目自帶的info.plist也是沒用的了,也能夠刪掉。
1.設置Target與plist文件對應
切換到Target目錄下,咱們能夠在這裏刪掉用不到的QQMF,選擇其中一個Target以後並選擇general,而後能夠看到每一個Target的右側都有對應的choose info.plist file選項,點擊能夠選擇與Target對應的plist文件。這也就至關於不一樣的Target項目對應了不一樣的plist配置。
2.爲每一個Target設置Display Name,Bundle Identifier等信息
點擊Target->選擇General,咱們分別設置不一樣項目的名稱和BundleID信息,以及證書等
同一份代碼區分不一樣Target的操做
使用多Target是爲了共用一部分代碼,可是有些共用的文件在不一樣的Target下是有細微不一樣的,那麼咱們在具體實現的時候就須要做出區分。這裏解決的方法是針對不一樣的Target定義宏。
首先選擇一個Target,如Customer,依次選擇Build Settings ->搜索PreprocessorMacros, 在找到PreprocessorMacros以後,咱們分別在Debug和Release中設置TargetType=1以下圖進行設置:
其餘的Target也是一樣的設置方式,只是要區分TargetType的值,分別是2,3(TargetType及其值都是自定義的)。而後就是在代碼中的使用以下圖,分別選擇Xcode左上角不一樣的Target運行,查看控制檯驗證是否成功。
1.解決使用Cocoapods的問題
由於存在多個Target,咱們須要區別的設置不一樣target須要的第三方庫,以下圖。這裏可能出現的問題是若是有不少相似AFNetworking這樣的被多個Target須要的類庫,咱們在刪除和增長的時候就會頻繁的操做並且會代碼冗餘。
解決上述問題的比較優雅的作法是以下:
3、遇到的問題
問題:invalid token at start of a preprocessor expression
緣由:這是我在pch文件中判斷target類型出現的錯誤,這句話的大體意思是:在預編譯階段,代碼並未運行,沒法判斷宏定義的值。最後查找到緣由是我在上述步驟設置宏定義的時候,手誤設置了TargetType==1,這本是一句須要執行才能獲得結果的代碼。因此沒法在#if的條件編譯中經過。
解決:在條件編譯中不使用代碼運行時才生成的量便可。