大家有沒有遇到下面的狀況
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é)束,歡迎大家提出意見和建議??。