在项目开发中,共享代码是很常见的。
由于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;