前面介绍过,虽然苹果公司禁止在iOS开发中使用动态库,而且也从XCode中移除了创建静态框架的功能,但我们还是可以通过对XCode进行小小的改动来创建静态框架。

编译环境:Macbook Air + OS X 10.9.2 + XCode5.1 + iPhone5s(iOS7.0.3)

首先创建一个静态库工程

给工程起个名字

创建成功

XCode5.0以后,创建的工程中默认自带了单元测试的代码:

即MyToolsFrameworkTestTests目录及TARGETS中的MyToolsFrameworkTestTests,这些代码不会对我们的代码产生任何影响,不用去管它们,如果实在看着不爽也可以删掉。

framework本质上是一个bundle,而我们当前的编译目标是一个静态库,所以必须删除当前的目标,新建一个bundle编译目标。

新建Target:File -> New -> Target... (该动作没有快捷键)

iOS框架中没有bundle模板,只有借助于OS X下面的bundle模板

新Target命名为MyTools,也可以使用原Target的名字,这样可能减少些麻烦

移动新Target中的Info.plist文件

删除MyTools目录,"Move to Trash"

删除多余的系统框架framework,此处要特别小心,千万不能用"Move to Trash",系统级框架,只有一份

此处会有个小问题(也可以不用理会),找到工程所在目录

发现MyTools目录实际上还在,MyTools-Info.plist文件仍在MyTools目录下,所以有时候,在XCode中进行的操作并不会在文件系统中体现出来,当然,这并不影响我们后续的工作

不过为了代码的整洁,还是可以整理一下

由于我们在文件系统中直接移动了MyTools-Info.plist的位置,所以XCode找不到了该文件,即二者之间的映射关系断开了,所以MyTools-Info.plist变成了红色,需要重新添加该文件到XCode中,也可以直接在Finder中拖拽该文件到XCode中

由于MyTools-Info.plist已经在指定位置,所以无需拷贝

删除红名的MyTools-Info.plist

首先选中TARGETS -> MyTools目标下的Build Settings面板,我们下面的一系列修改工作都在这里进行

由于我们选用OS X下面的模板,所以需要修改Architectures下Base SDK的值为Latest iOS(iOS 7.1)

修改Linking下面的:

Dead Code Stripping值为No

Link With Standard Libraries值为No

Mach-O Type值为Relocatable Object File

修改Packaging下面的Wrapper Extension值为framework

修改成功后会发现Products下面的MyTools.bundle变成了MyTools.framework

修改Deployment下面的OS X Deployment Target值为Compiler Default

由于我们修改了MyTools-Info.plist的位置,所以需要修改配置文件中的搜索路径

同时需要修改预编译文件pch的搜索路径及文件名

Build Settings面板里的修改完毕

最后一项,修改MyTools-Info.plist文件中的Bundle OS Type code的值为FMWK

修改全部完成

删除默认的.h和.m文件

将我们前面创建的静态库文件MyTools.h和MyTools.m文件拷贝过来

借用前面的成功,此处就不再重新建了

//
// MyToolsA.h
// MyToolsA
//
// Created by LZH on 14-8-14.
// Copyright (c) 2014年 LZH. All rights reserved.
// #import <Foundation/Foundation.h> @interface MyToolsA : NSObject - (int)add: (int)x Second: (int)y; //对象方法
+ (int)sub: (int)x Second: (int)y; //类方法 @end 
//
// MyToolsA.m
// MyToolsA
//
// Created by LZH on 14-8-14.
// Copyright (c) 2014年 LZH. All rights reserved.
// #import "MyToolsA.h" @implementation MyToolsA - (int)add: (int)x Second: (int)y{ return x + y;
} + (int)sub: (int)x Second: (int)y{ return x - y;
} @end

  

准备就绪,首先选定真机版本,"Command + B"编译

事情并没有我们预想的那般顺利

编译出错,原因是我们将原来默认的编译目标删除了,却没有重新配置编译目标,因此要重新配置项目

按下快捷键"Command + shift + ,"

修改编译目标为MyTools,同时配置生成Release版本

再次按下"Command + B",这次编译成功

Products下面的MyTools.framework也由红色变成了黑色,说明成功生成了framework框架

到文件系统中查看

发现虽然生成了框架目录,但是里面却没有发现必备的头文件,生成的framework有问题

清理掉先前的编译

选择TARGETS下MyTools目标的Build Phases

由于Compile Sources中已经添加了源文件MyToolsA.m,所以生成的框架中我们看到了二进制的框架文件MyTools

但是,这里并没有添加头文件,所以生成的框架中也没有头文件

手动添加头文件

点击下面的"+",选择MyToolsA.h头文件

拖动至Public

如下头文件MyToolsA.h和源文件MyToolsA.m都已成功加入

再次编译,看到了我们期待已久的头文件和二进制库文件,成功!

将目标平台由真机换成模拟器

再次编译,生成模拟器版本

注意:

如果先编译模拟器版本,即使编译成功了,Products下面的MyTools.framework也可能并不会又红色变成黑色,此处可能只关联到真机版本,所以不要怀疑自己,直接到文件系统下面去寻找。

找到生成的framework在文件系统中的路径

打开终端,开始版本合并

至此,framework创建完成,下面创建测试工程

工程命名

将生成的framework拖拽至工程中(我们刚刚把合并后的二进制文件MyTools放到了真机版的framework中覆盖掉了原来的MyTools文件,所以此处选择真机版的framework)

选择复制

在测试工程中看到了我们自定义的MyTools.framework

编写测试代码

//
// ViewController.m
// MyToolsFrameworkTest
//
// Created by LZH on 14-8-21.
// Copyright (c) 2014年 LZH. All rights reserved.
// #import "ViewController.h"
#import <MyTools/MyToolsA.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. int x = 10, y = 7; //使用类方法
NSLog(@"%d - %d = %d", x, y, [MyToolsA sub: x Second: y]); //使用对象方法
MyToolsA *myToolsA = [[MyToolsA alloc] init]; NSLog(@"%d + %d = %d", x, y, [myToolsA add: x Second: y]); } - (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

  

按下快捷键"Command + R"运行

模拟器版本运行结果

真机版本运行结果

大功告成!

收工!!!

iOS开发之静态库(四)—— 静态框架framework制作的更多相关文章

  1. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  2. 【转】iOS静态库 【.a 和framework】【超详细】

    原文网址:https://my.oschina.net/kaqijiang/blog/649632 一.什么是库? 库是共享程序代码的方式. 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存 ...

  3. iOS开发UI篇—简单介绍静态单元格的使用

    iOS开发UI篇—简单介绍静态单元格的使用 一.实现效果与说明 说明:观察上面的展示效果,可以发现整个界面是由一个tableview来展示的,上面的数据都是固定的,且几乎不会改变. 要完成上面的效果, ...

  4. iOS开发中与库相关的术语

    动态库 VS 静态库 Static frameworks are linked at compile time. Dynamic frameworks are linked at runtime

  5. iOS开发网络篇—简单介绍ASI框架的使用

    iOS开发网络篇—简单介绍ASI框架的使用 说明:本文主要介绍网络编程中常用框架ASI的简单使用. 一.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大 ...

  6. iOS开发Swift篇—(四)运算符

    iOS开发Swift篇—(四)运算符 一.运算符 1.Swift所支持的部分运算符有以下一些 赋值运算符:= 复合赋值运算符:+=.-= 算术运算符:+.-.*./ 求余运算符:% 自增.自减运算符: ...

  7. iOS开发常用第三方库

    UI 动画 网络相关 Model 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像照相视频音频处理 响应式框架 消息相关 版本新API的Demo 代码安全与密码 测试及调试 AppleWatch ...

  8. ios开发必备第三方库

    引言 作为iOS开发人员,在开发App的过程中怎么会不使用第三方库呢?相信没有App是不使用第三方库的! 网络库 网络库,这是开发必备,除非你的App玩单机.现在特别火也特别好用的网络库就数AFNet ...

  9. iOS开发 引用第三方库出现duplicate symbol时的处理方法

      该篇文章是我自己从我的新浪博客上摘抄过来的, 原文链接为: http://blog.sina.com.cn/s/blog_dcc636350102wat5.html     在iOS开发中, 难免 ...

随机推荐

  1. 使用max() 函数

    /********************************* 代码功能:使用串口输出a和b的最大值 使用函数:max(a,b); 创作时间:2016*11*04 作者邮箱:jikexianfe ...

  2. K.O. ----- bat文件的中文乱码

    -------siwuxie095 bat文件在保存时如果没有选择正确的格式,中文部分就会出现乱码 1.记事本 用记事本编写如下代码:        另存为:测试.bat,编码设置为:UTF-8,就会 ...

  3. HTTP-崔希凡笔记

    HTTP协议(重点) 协议:协议的甲乙双方,就是客户端(浏览器)和服务器! 理解成双方通信的格式! l  请求协议: l  响应协议: 1 安装HttpWatch HttpWatch是专门为IE浏览器 ...

  4. No module named yum错误的解决办法

    今天用yum安装软件的时候出现如下错误: There was a problem importing one of the Python modules required to run yum. Th ...

  5. $("<div />")代表的意思

    $("div")这个是匹配所有叫div的标签. $("<div />")表示生成一个div节点,但是div节点一般不通过这种方式,<div/& ...

  6. iOS 支付宝支付

    在开发过程中,经常需要接入第三方支付.下面对支付进行一个概括. 支付宝支付 支付宝SDK下载地址:https://doc.open.alipay.com/doc2/detail?treeId=54&a ...

  7. vnc 登录后只有终端 没有桌面 黑屏

    1, start vnc server: vncserver :1 issue: connect it with pc and only display one terminal. 2, stop v ...

  8. 巧用Javascript中的slice()

    slice()是Javascript中Array的一个方法,定义是这样的. arrayObject.slice(start,end)作用是从原数组中从start到end位置截取出一个新的数组,返回值是 ...

  9. ubuntu下非本账户的.profile文件的修改

    今天不小心在账户了修改了自己的.profile文件,导致重启之后账户无法进入,点登陆账户后黑屏后就重新回到账户登陆界面.一番折腾之后终于成功修改了原账户中的.profile文件,成功从新进入了原账户. ...

  10. JavaI/O系统

    I/O:(输入/输出)指的是计算机与外部世界,或者一个与计算机其余部分的接口.它对任何计算机系统都非常关键. Java类库中有大量的类,帮助我们从不同的设备读取数据并保存或输出到不同的设备中. 这些类 ...