iOS开发之静态库(四)—— 静态框架framework制作
前面介绍过,虽然苹果公司禁止在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制作的更多相关文章
- ios 开发中 动态库 与静态库的区别
使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...
- 【转】iOS静态库 【.a 和framework】【超详细】
原文网址:https://my.oschina.net/kaqijiang/blog/649632 一.什么是库? 库是共享程序代码的方式. 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存 ...
- iOS开发UI篇—简单介绍静态单元格的使用
iOS开发UI篇—简单介绍静态单元格的使用 一.实现效果与说明 说明:观察上面的展示效果,可以发现整个界面是由一个tableview来展示的,上面的数据都是固定的,且几乎不会改变. 要完成上面的效果, ...
- iOS开发中与库相关的术语
动态库 VS 静态库 Static frameworks are linked at compile time. Dynamic frameworks are linked at runtime
- iOS开发网络篇—简单介绍ASI框架的使用
iOS开发网络篇—简单介绍ASI框架的使用 说明:本文主要介绍网络编程中常用框架ASI的简单使用. 一.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大 ...
- iOS开发Swift篇—(四)运算符
iOS开发Swift篇—(四)运算符 一.运算符 1.Swift所支持的部分运算符有以下一些 赋值运算符:= 复合赋值运算符:+=.-= 算术运算符:+.-.*./ 求余运算符:% 自增.自减运算符: ...
- iOS开发常用第三方库
UI 动画 网络相关 Model 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像照相视频音频处理 响应式框架 消息相关 版本新API的Demo 代码安全与密码 测试及调试 AppleWatch ...
- ios开发必备第三方库
引言 作为iOS开发人员,在开发App的过程中怎么会不使用第三方库呢?相信没有App是不使用第三方库的! 网络库 网络库,这是开发必备,除非你的App玩单机.现在特别火也特别好用的网络库就数AFNet ...
- iOS开发 引用第三方库出现duplicate symbol时的处理方法
该篇文章是我自己从我的新浪博客上摘抄过来的, 原文链接为: http://blog.sina.com.cn/s/blog_dcc636350102wat5.html 在iOS开发中, 难免 ...
随机推荐
- 开发板通过UART向主机发送数据
/********************************* 代码功能:开发板通过UART向主机发送数据 使用函数: Serial.begin(数据传输的波特率); Serial.printl ...
- SQL语句-批量插入表(表数据插表)
批量插入表(表数据插表) ****1.INSERT INTO SELECT语句语句形式为:Insert into Table2(field1,field2,...) select value1,val ...
- laravel 事件的使用案例
以下是我对事件使用的一些记录 创建事件 执行以下命令,执行完成后,会在 app\Events 下面出现一个 DeleteEvent.php 文件,事件就在次定义 php artisan make:ev ...
- 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程
[前提] 想要实现使用某种语言,比如Python,C#等,去实现模拟登陆网站的话,首先要做的事情就是使用某种工具,去分析本身使用浏览器去登陆网页的时候,其内部的执行过程,内部逻辑. 此登陆的逻辑过程, ...
- php基础-转义字符
1.php是弱类型语言,定义变量时无需要定义 2.标量类型:整形.浮点型.字符串类型.布尔型 复合类型:数组.对象 其它类型:资源类型(resource如数据库连接,打开文件句柄,资源在不需要时都要释 ...
- struts2获取web元素的方式和方法
获取web资源的方式按是否与servlet耦合可分为两种,再细分按照依赖方式又有两种即 依赖容器 和 依赖注入 什么是依赖容器 就是依赖 ActionContext或者ServletActionC ...
- 【筛法求素数】【质因数分解】bzoj2721 [Violet 5]樱花
http://www.cnblogs.com/rausen/p/4138233.html #include<cstdio> #include<iostream> using n ...
- processing学习笔记
这是从http://funprogramming.org/视频学习过程中做的笔记,没法看视频的话,请FQ 点point(x,y); 线line(x,y,x2,y2); 背景background(x), ...
- iOS 关于nil和Nil及null与<null>的区别
问题是这样的. NSDictionary *sample = [NSJSONSerialization JSONObjectWithData:received options:NSJSONReadin ...
- UIPageControl页控制器
一.基本知识 #import "ViewController.h"@interface ViewController ()<UIScrollViewDelegate>{ ...