多項目協(xié)作


大家有沒有遇到下面的狀況

1.在工作中很多時候時候老板會突然讓你把你的項目寫成SDK發(fā)布出去,或者嵌入到其他項目里

2.也有的時候多部門開發(fā)需要用到同樣的代碼(比如該公司所有的產(chǎn)品都用同一套登錄系統(tǒng))

3.再比如大家用了同樣的一套自己本公司開發(fā)的SDK。

等等。今天給大家介紹一下多項目協(xié)同。

創(chuàng)建workspace

File -> New -> Workspace。我們把它創(chuàng)建到我們指定目錄(我這里創(chuàng)建了一個文件夾叫“多項目工程”,Workspace叫“多項目”)。現(xiàn)在打開看見里面是空的像這樣:


添加可工作項目

點擊右下角“+”,選擇“News project”,和平時一樣創(chuàng)建一個工程項目(這里起名“主工程”)。


創(chuàng)建子工程

選擇File\New\Project,在Choose a template 對話框中選擇iOS\Framework & Library\Cocoa Touch Static Library,如下圖:


(我這里起名Other,放到了“多項目工程”文件夾下)


將子工程放到同一個工程下

找到Other.xcodeproj 直接拖到workspace右側(cè)的空白中中,注意在列表里是和“主工程”平級。


我們把啟動項目改為Other


運行一下,發(fā)現(xiàn)Products文件夾里面的.a從紅色變成了黑色


在上面,右鍵 -> show In finder 可以找到這個.a

這里要注意.a分為 模擬器版 和 真機版。這取決于你用什么跑的。


把兩個.a合并成一個通用的.a

在Xcode菜單中選擇File/New/Target,選擇iOS/Other并點擊Aggregate,如圖:


將目標命名為UniversalLib,確保選中ImageFilters工程,如圖:


在工程導航視圖中選中Other,然后選擇UniversalLib目標。切換到Build Phases標簽;在這里設(shè)置構(gòu)建目標時將要執(zhí)行的動作。

點擊左上角"+"按鈕,在彈出的菜單中選擇Add Run Script,如下圖:


現(xiàn)在你需要設(shè)置腳本項。展開Run Script模塊,在Shell行下粘貼如下代碼:

# define output folder environment variable

UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal

# Step 1. Build Device and Simulator versions

xcodebuild -target ImageFilters ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos? BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"

xcodebuild -target ImageFilters -configuration ${CONFIGURATION} -sdk iphonesimulator -arch i386 BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"

# make sure the output directory exists

mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"

# Step 2. Create universal binary file using lipo

lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT_NAME}.a"

# Last touch. copy the header files. Just for convenience

cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/include" "${UNIVERSAL_OUTPUTFOLDER}/"


然后,按住這里

會有一個Edit schemes的選項,點進去,點擊“Build”,點擊下面的“+”,把剛才咱們寫的那個加進來。


運行之后,再次show in finder,會發(fā)現(xiàn)多了一個文件夾。

這里面就是我們要的了。


直接把這個.a拖動到“主工程” -> TARGETS ->Build Phases ->Link Binar With Libraries

(* 不要勾選 Copy Item if needed)


然后找到“主工程”的Header Search Paths。


把剛才.a上面的include直接拖到里面,這里大家最好拖iphonesimulator的,因為universal的不會實時更新,平時大家都用模擬器所以iphonesimulator的會方便一下。


先看看效果:

在主工程中的ViewController.m里面引用Other的文件,記住用#import<>


運行下看看效果:


然后我們再把Other里面的輸出改為b

運行效果


如果你這里沒有變化 那么你是之前拖.a的時候,勾選了copy item if need了。刪了重新拖一次就好了

OK到這里已經(jīng)成功大半了!

接下來我們來處理nib以及一些資源的封包


首先創(chuàng)建一個VC不用nib的(OtherCodeViewController)

為了方便我們把這個VC背景設(shè)置為Red

然后再主工程的VC中present這個VC

這是后大家#import會發(fā)現(xiàn)沒有想要的頭文件,Other->targets->BuildPhases->CopyFiles

把想要公開的頭文件添加到里面,因為這個是對外開放的思想并不是所有的頭文件都要放到里面。

這里建議大家最好建立一個Manager類來統(tǒng)一控制整個工程,然后另一個工程只是通過這個Manager來調(diào)用該工程。

當然如果大家僅僅是開發(fā)啥的只要把主工程里面的headPath中添加Other的工程地址就好,注意需要把地址郵編的non-recursive改為recursive(不建議使用,破壞分裝性)。


繼續(xù)我們來present這個VC


沒有任何問題。

接下來present一個NIB的VC試試。(OtherNibViewController 背景顏色 blue)

哈哈崩了,報錯如下

nib加載不到。

原因很簡單默認bundle是本工程下的mainBundle,但是咱們這次創(chuàng)建的是其他工程下的nib,本工程是沒有的,所以需要手動加載過來。

首先讓我們創(chuàng)建一個bundle

File -> New -> Target -> Framework&Library -> Bundle

命名為OtherResource。

把這個bundle的base SDK改為iOS


然后操作如圖


勾選上咱們剛才創(chuàng)建的bundle。

運行一下這個bundle

生成了我們要的bundle

然后把右鍵 Show In Finder

操作如圖(* 不要勾選 Copy Item if needed)

然后把代碼修改如下


OK了。

然后我們在換一個背景顏色。哈哈,沒有變,還是以前的顏色,這是因為bundle沒有跟著更新。

咱們再運行一次bundle,然后在運行一次項目,好了這次可以了。但是每次都要挨個運行很麻煩,可以如下設(shè)置。

首先先選中主工程 如下圖

點擊這里,下面會有一個edit scheme。然后把bundle勾選上


第一次要先build一遍,后邊直接run就好了。


從此以后每次在Other上創(chuàng)建nib的時候都會在targets里面出現(xiàn)這個bundlle,記住勾上就好了。

每次添加圖片的時候也一樣。

OK到此結(jié)束,歡迎大家提出意見和建議??。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容