在項目開發中,共享代碼是很常見的。
由於iOS的限制,我們無法以“動態庫”的形式共享代碼。除了以源代碼方式,我們只能選擇靜態庫來共享代碼。
“真框架”項目以編譯後的二進制形式共享代碼,本質上還是一種靜態庫。但由於Xcode的限制(沒有提供相應的項目模板),要以框架的形式編譯出靜態庫,仍然十分麻煩。
首先,你需要下載 iOS Universal Framework Mk 7。解壓elc-ELCImagePickerController-b5357fa.zip。在解壓目錄下,打開終端運行RealFramework目錄(即“真框架”)下的install.sh腳本。真框架就會安裝到Xcode中。
注意:install.sh腳本需要root權限。
一、創建“真框架”項目
打開Xcode4.2,你現在創建一個Static iOSFramework項目了。
輸入項目名稱,如TestFramework。
現在我們准備把一個正常的Application項目封裝為“真框架”項目。這個正常的Application項目可以獨立運行,擁有自己的window、viewcontroller和圖形界面。
當然,你手上可能擁有別的Application項目,你完全可以把自己的Application項目封裝為“真框架”。
把這個Application項目的資源:.h文件、.m文件、.xib文件、.png文件、.plist文件,甚至是數據庫文件都拖到TestFramework項目中來,如下圖所示:
打開Target的Build Phases,可以看到CopyHeaders的Project段包含了項目所有的頭文件:
將所需頭文件拖到Public段。凡是使用該框架時要用到的頭文件都應該聲明為Public。這裡,為圖省事,我把所有頭文件都聲明為Public了。
然後是框架的引用。這很簡單,把Application中用到的框架都聲明在“真框架”項目的Link Binary With Libaries中。如下圖所示。
然後Build項目。編譯結果將放在“{USERNAME}/Library/Developer/Xcode/DerivedData/{PROJECT_NAME_AND_RANDOM_CRAP}/Build/Products/{BUILD_TYPE}”目錄下。每個BUILD_TYPE目錄下都有一個.embeddedframework和一個.framework文件。其中.framework只包含代碼,.embeddedframework除代碼外還包括資源。一般使用.embeddedframework。
注意,有時候編譯出現“UILable 類型未聲明”之類的錯誤。這是因為在Application項目中,默認是包含UIKit頭文件的,而“真框架”項目卻未包含UIKite頭文件,所有的UIKit類型都不能被Xcode正確識別。我們只需要在.pch文件中加入“#import ”語句即可。
二、使用“真框架”
很簡單,新建一個Application項目,將.embeddedframework文件(其實是一個文件夾)直接拖到項目文件夾中:
在TestFramework.embbeddedframework中,已經包含了TestFramework.framework,同時還有一個Resources目錄,包含了真框架用到的所有資源。
查看Target的Builder Phases,你可以發現TestFramework.framework框架已經被包含進LinkBinary with Libraries了。
當然,由於“真框架”並不會把依賴的庫編譯到框架文件中(僅僅是引用),我們還必需在項目中加入TestFramework框架所用到的其他庫和/框架(圖中所列的庫/框架因具體項目而異):
現在,我們就可以在Application中使用真框架了:
#import <TestFramework/System.h>
⋯⋯
System* vc=[[Systemalloc]init];
self.window.rootViewController=vc;