ios開發--xcode如何實現多工程聯編

在開發項目時,有時候需要依賴其他的工程(通常是第三方開源的靜態庫工程)。網上有很多第三方開源庫都是以一個靜態庫工程提供給開發者的(比如Codova, CocoaPods等)。

其次,我們自己可以建一個這樣的靜態庫工程,專門用來放自己在實際開發中用的比較多的技術,比如一些幫助類,一些好的技術封裝等等。這樣在開發新項目時,就可以把這個工程引入進來,要用裏面的功能時就可以直接使用,不用找這個工程copy下,那個工程copy下,最後找不到了就更頭疼。只要我們維護好這個靜態庫工程,以後開發就會省事不少。


場景1:把依賴工程作爲主工程的一個子工程, 這種十分簡單,在此不做介紹。(蘋果官方文檔中有對其的介紹)

場景2:建工作區,把相關的工程導入到工作區下。在工作區下面的工程都是並列關係。

example :
工作區 :MyWorkplace
主工程 : MyApp
依賴庫工程 :MyLib

   利用Xcode新建一個工作區MyWorkplace,會生成一個MyWorkplace.xcworkspace文件,這就是工作區工程文件,打開該文件,在裏面新建一個應用程序工程MyApp,新建一個Static Lib工程MyLib。這樣工作區裏面就有兩個工程,接下來就是配置讓MyApp能夠編譯,使用MyLib。
   1.設置兩個工程依賴關係。進入MyApp工程的"MyApp"target的“Build Phase”設置項頁面,展開“Link Binnary WithLibraries”選項卡,點擊“+”,選擇“Workspace”中的“libMyLib.a”。此步有兩個作用:一是設置MyApp的庫依賴,這樣編譯MyApp時,編譯器會自動編譯MyLib工程。二是設置MyApp找尋該靜態庫的搜索路徑,會自動設置“Library Search Paths”,這樣鏈接時,MyApp就知道去哪裏鏈接libMyLib.a文件了。
   2.設置頭文件搜索路徑。進入MyLib工程的"MyLib"target的“Build Phase”設置項頁面,添加一個設置項“Copy Files”,然後選擇“Destination”爲“Products Directory”。Subpath設置成“include”即可,這是指定將那些MyLib中的頭文件copy到“include”中去,也可以自定義這個路徑,接下來我們需要用到這個路徑。進入MyApp工程的"MyApp"target的“Build Settings"頁面,找到“User HeaderSearch Paths”,設置爲“$(BUILT_PRODUCTS_DIR)”,這是爲了讓MyApp能夠找到MyLib公開的頭文件,否則編譯是會找不到頭文件報錯的。
   3.如何在static lib中加入資源。通常,在我們的靜態庫工程中,會包含有資源文件,比如images,xib, plist等等,但這些資源文件在編譯過程中是不會加入到.a中的,所以我們需要通過其他的途徑把資源提供給使用者。個人推薦使用bundle,一來bundle會被編譯,xib文件會成爲二進制文件,這樣外界就無法查看xib的內容,其次也是一個很好的封裝,很方的插入或刪除資源,這也是目前大多數SDK提供商採用的普通方式。方法:在MyLib中添加一個Target,選擇“OS X”下的“Framework & Library”,選擇“Bundle”。進入MyLibBundle的“Build Setting”設置頁面,修改“Base SDK”爲 “Latest iOS(iOS latestversion)”。然後就可以往MYLibBundle裏面加入你想要的資源了。
在MyLib代碼中要引用MyLibBundle中的資源文件時,需要這樣使用:

#define MyLibBUNDLE_NAME @ "MyLibBundle.bundle"
#define MyLibBUNDLE_PATH [[[NSBundle mainBundle] resourcePath]stringByAppendingPathComponent: MyLibBUNDLE_NAME]
#define MyLibBUNDLE [NSBundle bundleWithPath: MyLibBUNDLE_PATH]

xib :
self = [super initWithNibName:@"MyLibViewController"bundle:MyLibBUNDLE];

image :
+ (UIImage *)getImageWithName:(NSString *)pImageName {
    return[UIImage imageWithContentsOfFile:[[MyLibBUNDLE resourcePath]stringByAppendingPathComponent:pImageName]];
}
  4. 主工程引用靜態庫工程的資源。 我們上面創建好了MyLibBundle,MyApp已經可以訪問MyLib的.a和.h了,現在配置MyApp訪問MyLibBundle。本人愚笨,因爲時間關係,暫時沒有找到一個非常好的辦法,但是想出一個方法可以解決這個問題。進入MyApp的“Build Phases”,添加選項“Run Scrip”,添加下述腳本:
cp -R ${BUILT_PRODUCTS_DIR}/MyLibBundle.bundle${BUILT_PRODUCTS_DIR}/${TARGET_NAME}.app
MyLibBundle.bundle就是你在MyLib中新建的bundle的target名字。該腳本作用就是把生成的.bundle拷貝到最終生成的.app中,這樣.app中就包含了我們MyLib要用到的資源。

  5. 做完上述操作,已完成了多工程聯編的99%的配置工作。現在我們編譯MyApp工程,已經會先編譯MyLib,然後一切運行OK,但是運行程序時爆掉了,原因是我們用到了MyLib的UI,但MyLib找不到這個MyLibBundle。原來我們還未聯編MyLibBundle這個target。 簡單,進入target“MyLib"的“Build Phases”,展開“Target Dependencies”,添加“MyLibBundle”。這樣就添加了MyLib的依賴,在編譯MyLib時,編譯器就會去編譯MyLibBundle。好啦,再重新編譯,發現已經可以正常運行啦,但是需要告訴廣大同胞的是,我們在修改了MyLib的代碼時,最好clean一下工程在重新編譯,因爲xcode的緩存可能導致你剛剛修改的內容尚未編譯到.a中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章