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开发中, 难免 ...
 
随机推荐
- IP验证
			
function isIP(str) { var IP = '(25[0-5]|2[0-4]\\d|1\\d\\d|\\d\\d|\\d)'; var IPdot = IP + '\\.'; var ...
 - 【iOS问题】The file “XXX.app” couldn’t be opened because you don’t have permission to view it.
			
当引入第三方的框架的时候 容易产生以下问题: The file "XXX.app" couldn't be opened because you don't have permis ...
 - oracle 同时更新(update)多个字段多个值
			
--创建表A,B: create table A (a1 varchar2(33),a2 varchar2(33),a3 varchar2(33)); create table B (b1 varch ...
 - [转]VS 2013 连接数据库报错 未能加载文件或程序集 Microsoft.SqlServer.Management.Sdk.Sfc
			
原文链接:http://stackoverflow.com/questions/16906686/could-not-load-file-or-assembly-microsoft-sqlserver ...
 - 技术英文单词贴--C
			
C category 种类,分类,范畴 cols 列数目 comma 逗号 component 组件,部件,成分 configure 配置,安装 configuration 配置,布局,构造 cons ...
 - linux增加用户并赋予权限/用户和用户组操作命令
			
===============ubuntu================================================== 在Ubuntu13.10下创建一个新的用户:Step1: ...
 - deepdetect 用c++11写的机器学习caffe和XGBoost API 接口
			
https://github.com/beniz/deepdetect DeepDetect (http://www.deepdetect.com/) is a machine learning AP ...
 - DNS主从TSIG加密传输
			
BIND服务程序为了能够安全的提供解析服务而支持了TSIG加密机制,TSIG主要是利用密码编码方式保护区域信息的传送(Zone Transfer),也就是说保证了DNS服务器之间传送区域信息的安全. ...
 - Jquery点击发送按钮后,按钮文本倒计时
			
1.html代码 <input type="number" id="mobileNo" placeholder="请输入手机号" /& ...
 - 使用12c的DBCA创建数据库的时候报错TNS-04404
			
情况:之前使用的默认的pdb数据库pdborcl,连接的时候使用SQLdeveloper,配置了tnsname.ora,里面添加了pdborcl的service:这里报错是感觉tnsname配置错误了 ...