Xcode5制作Framework

来源:互联网 发布:免费地方门户源码 编辑:程序博客网 时间:2024/05/17 09:38

Mac OS X 扩展了 Framework 的功能,让我们能够利用它来共享代码和资源。通过 Framework 我们可以共享所有形式的资源,如动态共享库,nib 文件,图像字符资源以及文档等。系统会在需要的时候将Framework 载入内存中,多个应用程序可以同时使用同一个 Framework,而内存中的拷贝只有一份。一个 Framework 同时也是一个 Bundle,我们可以在 Finder 里浏览其内容,也可以在代码中通过 NSBundle 访问它。利用 Framework 我们可以实现动态或静态库的功能。

下文就来教你如何制作一个iOSFrameworkMac OS X的操作方法一样

 制作Framework

 

1.创建一个名为PersonFramework 模板选择“Cocoa Touch Static Library”

1

2.填写项目名称

2

3.清理工程无用文件( Target 、  PersionFramework、 PersionFrameworkTests

子删除这些文件前 整项目的结构是这样的

3

如何删除?

4

删除文件后 是这样的:
5

 

4.删除旧的Target的编译设置:

a.

6

b.点击Manage Schemes

7

 

c.delete

8

d.弹出框点击delete

9

 

5.我们把Target删除后 需要添加一个新的Target

10

接下来选择模板(Bundle)

11

填写名字 DemoFrame

12

6.修改新的Target编译配置

选择上面新建的target 并切到Build Settings选项卡

13

需要修改的地方 我将会以图片并用红色线圈出来展示,文字描述可能不是很好找

a. Architectures 改为 Standard architectures (armv7, armv7s)根据需要修改

b.在 Deployment 下,将 “Mac OS X Deployment Target”改为”Compiler Default”,将 “Targeted Device Family”改为需要的,此处改成了”iPhone/iPad”,同时可以根据需要修改 “iOS Deployment Target”,此处改为了 “iOS 7.1”(更具需求来,你需要支持到最低系统版本是多少就选多少):

c.在 Linking 中,将 “Dead Code Stripping” 改为 “NO”,将 “Link with Standard Libraries” 改为 “NO”,将 “Mac-O Type” 改为 “Relocatable Object File”:

d. Packaging 中,将 “Wrapper Extention” 改为“framework”:

e.修改 Info,将 “Bundle OS Type Code” 改为 “FMWK”(Framework )

f.修改预编译头文件,注视其中代码

15

 

到此为止,基本的配置就算完成了,可以看到现在的 Products中的文件为 DemoFrame.Framework,这个就是其它项目需要使用的Framwwork,但在这之前首先编写一些 DemoLibrary.framework 中的内容,然后把接口提供给其它工程。

7.给调用该Framework的项目提供API

我们就简单的写一个NSLog 好了

首先建一个名叫FrameDemo的Class

16

不要忘记选Target

17

FrameDemo.h

18

FrameDemo.m

19

导出头文件

20

开始添加

21

选中.h文件

22

添加后效果

23

 

到这里,大功告成,但这个地方有一个细节要注意,当前选择Build生成的Framework要选择iOS Device,不要选择你当前链接的真机,否则会出现在打包的Framework在别的机器上使用时出错。

24

另外,当前的Framework适合真机,如果要做模拟器的Framework,要修改成模拟器版本

25

好了,现在可以Build  FrameworkHome 工程了

26

我们要的FrameWork出现了

如果要模拟器的 讲运行环境设置为模拟器 在编译就好了

其中Debug-iphoneos中的framework就是真机版本的,下边的文件夹就是模拟器版本的。

 

测试Framework

新建一个iOS项目

导入Framework

编写代码:

QQ20140510-1

有没有看到效果?

好了 制作Framework的教程完成了。

补充

1.读取文件

Framework中的代码就要这样读取文件了,当然还有其他的初始化路径方法,有需要的可以以后补充。

示例代码如下:

NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@”Resource” withExtension:@”bundle”]];

UIImage *img = [UIImage imageWithContentsOfFile:[bundle pathForResource:@"testImg" ofType:@"png"]];

[viewCtr.view addSubview:[[UIImageView alloc] initWithImage:img]];

2.建立一个真机和模拟器通用的Framework

首先用Finder找到Framework所在的位置

然后找到Framework中的文件,例如这里的 Kalagame-library,并且纪录其路径 os_frame_path

同样方法打开另一个文件夹,纪录其中库的路径,simulator_frame_path

然后打开控制台,输入 lipo -create os_frame_path simulator_frame_path -output newframe

这样就完成了模拟器和真机版本framework的合并,用finder找到这个newframe,然后把newframe改名字,并放回到framework文件夹中,替换原来的文件就可以了。

3.错误1

在制作framework或者lib的时候,如果使用了category ,则使用该FMWK的程序运行时会crash,此时需要在该工程中 other linker flags 添加两个参数  -ObjC -all_load

4.警告

编译出Framework是,需要把 GenerateDebugSymbols =NO,project与target都要设置下,否则会出现很多 warning:

类似

warning: (armv6) /Users/myuser/Library/Developer/Xcode/DerivedData/ ….build/Objects-normal/armv6/ImageRequest.o unable to open object file

 

再遇到错误再补充

Enjoy.

0 0