写在前面:
通过 Framework 可以在物理上实现 iOS 程序的模块化。
好处:
不足:
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 查看结果:
下面介绍一下如何使用整个framework 即可模拟器使用也可以真机使用。
演示前先输入iphoneos(真机)和iphonesimulator(模拟器)版本的tgfmwk.framework,这里使用的是Release版。(product--edit scheme)
输出后可以在DeviceData/fmwksqlite/build/products/
下面是合并的关键,
先来看一下framework中的tgfmwk
打开终端。输入pwd 先看一下当前所在的目当路径。使用ls 查看当前目录下的文件夹。
cd /users/[用户名]/Desktop/fmwksqlite/DerivedData/fmwksqlite/build/products/release-iphoneos/tgfmwk.framework
然后使用lipo -info tgfmwk 查看一下库的信息。
看到输出Non-fat file: tgfmwk is architecture: armv7
这里表明只支持真机。
同样的再来看看模拟器的。
cd /users/[用户名]/Desktop/fmwksqlite/DerivedData/fmwksqlite/build/products/release-iphonesimulator/tgfmwk.framework
然后使用lipo -info tgfmwk 查看一下库的信息。
看到输出Non-fat file: tgfmwk is architecture: i386
可见要想真机和模拟器都可以使用该framework需要将这两个版本的tgfmwk文件进行合并。
使用命令lipo -create xxxx/tgfmwk xxxxx/tgfmwk -output tgfmwknew
其中xxxx表示路径,一个是真机的tgfmwk所在路径,一个是模拟器tgfmwk文件所在路径,然后输出tgfmwknew新的文件。输出后,只需要将这个tgfmwknew重命名为tgfmwk然后复盖原来的tgfmwk 文件即可。把复盖后的这个tgfmwk.framework考出来到具体使用的项目就可以实现真机和模拟器通用的framework 了。
看一下tgfmwknew的信息。
显示:Architectures in the fat file: tgfmwknew are : armv7 i386
可见这个合并的文件已具备了armv7(真机)和i386(虚拟机)的能力。
12、这是手工制作 Framework 的方法,网上有人制作了工程模版,可以直接生成 Framework 工程:
https://github.com/kstenerud/iOS-Universal-Framework
.sh文件的安装
framework库的使用方法跟“xcode4.3.2
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版本