http://blog.sina.com.cn/s/blog_74e9d98d01014j2h.html
写在前面:
通过 Framework 可以在物理上实现 iOS 程序的模块化。
好处:
1、如果模块间接口定义的比较完善,模块化的程序具有很好的可扩展性与内聚性;
2、物理上的模块化便于开发过程的管理与测试,尤其是在程序规模相对大。
3、如果可以使用胶水语言作为粘合剂,程序可以用很少的代价适应未来的变化。
不足:
1、由于是静态库,应该不会有什么运行时的损失,但是没试验过,不确定。
2、资源的加载这部分,不知道会不会占用更多内存,没试验,不确定。
1、新建一个静态库工程:
2、删除向导所生成工程中的 Target:
删除目标前工程状态
删除目标后工程状态
3、删除旧目标对应的工程文件夹:
删除前,注意:此处删除会弹出提示框,要选择“只删除引用”
删除后
4、删除旧目标对应的编译设置(Product菜单| Edit Scheme命令):
点击左下角的 Manage Schemes 按钮:
选中旧的 Scheme,点击左下角的减号删除:
删除完成后,点击 OK 返回。
5、增加一个新目标。点击 “Add Target”:
在弹出的对话框中选择 Mac OS X 下的 Bundle:
如上图,给库取一个名字,保持默认的 Framework(CoreFoundation),然后点击 Finish。
6、修改新目标的工程设置。选中 TARGETS 中对应的目标, Build Settings 页:
在 Architectures 下,将”Base SDK”改为”Latest iOS”,然后将 “Architectures” 改为 “Standard”:
在 Deployment 下,将 “Mac OS X Deployment Target”改为”Compiler Default”,将 “Targeted Device Family”改为需要的,此处改成了”iPhone/iPad”,同时可以根据需要修改 “iOS Deployment Target”,此处改为了 “iOS 3.0”:
在 Linking 中,将 “Dead Code Stripping” 改为 “NO”,将 “Link with Standard Libraries” 改为 “NO”,将 “Mac-O Type” 改为 “Relocatable Object File”:
在 Packaging 中,将 “Wrapper Extention” 改为“framework”:
7、修改目标的 Info。点击 Info:
将 “Bundle OS Type Code” 改为 “FMWK”(Framework 的意思):
8、修改预编译头:
修改前
修改后
9、向工程中添加一个类(ViewController 与 Xib):
结果如下:
10、导出相关文件。选中 Target,点击 Build Phases:
点击右下角的 “Add Build Phase”:
在弹出的菜单中选择 “Add Copy Headers”,添加完成后,展开 “Copy Headers”:
点击加号:
选中需要暴露的头文件,此处我们选择 “ClassA.h”:
点击 Add 按钮完成添加:
此时,我们看到导出的文件在 Project 下,这样是不能暴露给别人使用的,将其拖动到 Public 下:
关于 Framework 的详细说明参考苹果的在线文档:http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPFrameworks/Frameworks.html#//apple_ref/doc/uid/10000183-SW1
11、编译项目(build),products右键,show in finder 查看结果:
12、这是手工制作 Framework 的方法,网上有人制作了工程模版,可以直接生成 Framework 工程:
https://github.com/kstenerud/iOS-Universal-Framework
.sh文件的安装 打开终端,定位到sh文件所在的目录,在当前目录下输入 sudo ./名称.sh
framework库的使用方法跟“xcode4.3.2 ios5.1 下制作ios的静态库”文章差不多
发布时注意:
If your framework has only code, and no resources (like images, scripts, xibs, core data momd files, etc), you can distribute (your framework).framework to your users and it will just work.
If you have included resources in your framework, you MUST distribute (your framework).embeddedframework.
在编译时,不用担心时device还是模拟器,只要管release还是debug版本