開發中會有一些常用的類或方法,或者是某個特定功能的,比如一個自定義的彈框、一個更容易使用的網絡請求庫,可以把它們放到一個單獨的工程里,通過靜態庫(library、FrameWork)的方式應用到任何其他需要的項目里。就像使用百度地圖sdk那樣。
現在有一些文章介紹如何構建和使用自定義的靜態庫,但似乎沒有說使用Workspace的。其實本質上,Workspace還是編譯靜態庫然后給主工程使用,但不用先打開工程A,編譯出libA.a,然后把文件拖到工程B,然后再工程B里面使用。主工程和它所用到的庫工程是在同一個工作環境下(估計這就是Workspace的名字意思吧)。配置好了之后,你只需要運行主工程的target,會自動幫你編譯需要的庫。用過Pods庫應該就明白。
總結了一下使用WorkSpace的好處:
1.只需要打開一個工作環境,需要修改、同步代碼,都不需要打開新的項目、新的文件,讓人可以集中心思在代碼上,在不同的項目里跳來跳去很容易打斷思維的。
2.可以像同一個工程里一樣,直接點擊方法名查看引用庫項目的代碼,否則就要打開另一個項目,然后找到對應文件再找到方法。
3.只要運行自己的項目就行,就會自動幫你編譯庫文件。
下面就以一個小例子來說一下workspace的操作。
1.新建項目MyWorkSpaceDemo為主工程。
2.新建.a庫工程
3.新建workspace工程,將上面兩個工程加入
目錄如下:
4.在PersonManager工程中的targets中選擇PersonManager的在Build Phases中新建Copy Files將libPersonManager.a導入,修改Desination為Absolute Path相對路徑,Path改為$(SRCROOT)。會在當前目錄生成libPersonManager.a文件。在另一個Copy Files中,導入頭文件,修改路徑為相對路徑$(SRCROOT)/Headers,這樣會在當前目錄下生成Headers文件夾,將需要外面使用的頭文件拷貝到該文件夾下。在Build Settings中修改Deployment下的iOS Deployment Target為iOS某個版本。
5.在PersonManager的targets下新建一個target->OS X(Framework&LIbiary)->Bundle為一個資源包。在Build Phases中Copy FIles使用相對路徑,目錄為$(SRCROOT),添加PersonRes資源包,這樣會在編譯后在當前目錄下生成一個bundle資源文件。在Copy Bundle Resources中加入圖片等資源。在Build Settings中修改Architectures下的Base SDK為iOS下的,因為bundle只有os下才有。
如果有版本要求,在Build Settings中修改Deployment下的iOS Deployment Target為iOS最低的版本。
6.在主工程MyWorkSpaceDemo的在Build Phases中Link Binary With Libraries中導入上面.a靜態庫和bundle資源包。在Build Settings的Header Search Paths中加入$(SRCROOT)/PersonManager/Headers屬性為recursive自循環查找。$(SRCROOT)/為當前目錄;$(SRCROOT)/../為當前目錄的上級目錄。
7.在主工程需要使用第三方的地方,導入頭文件。然后使用即可。
這樣就可以對封裝的類庫進行斷點調試,也方便統一管理。