[iOS] 建立与使用Framework
[iOS] 建立与使用Framework
前言
使用XCode开发iOS项目时,开发人员可以将可重用的程序代码,封装为Library或是Framework来提供其他开发人员使用。这两种封装方式在使用的时候:Library需要将.a封装档与所有公开的.h档提供给使用者加入项目,而Framework则只需要将.framework封装档提供给使用者加入项目。就使用情景来说,提供单一.framework封装档会显得比较简单方便。本篇文章介绍如何将可重用的程序代码封装为Framework,主要为自己留个纪录,也希望能帮助到有需要的开发人员。

建立
首先开启XCode来建立一个新项目:「MyFramework」,专案类型选择为Cocoa Touch Framework。这个项目用来封装可重用的程序代码,提供其他开发人员使用。
专案类型

接着在MyFramework加入一个新类别:「MyClass」,做为提供给其他开发人员使用的程序代码。
MyClass.h
#import <Foundation/Foundation.h> @interface MyClass : NSObject // methods
- (NSString*) getMessage; @end
MyClass.m
#import "MyClass.h" @implementation MyClass // methods
- (NSString*) getMessage {
return @"Clark";
} @end
建立好MyClass之后,接着要把MyClass.h设定为Public,让使用的开发人员可以加入类别的.h档参考。
Public Headers

接着在项目预设的MyFramework.h里面加入MyClass.h档的参考,让后续使用的开发人员只要import单一个MyFramework.h檔,就可以引用到Framework里Public出来的.h檔。
MyFramework.h
#import <UIKit/UIKit.h> //! Project version number for MyFramework.
FOUNDATION_EXPORT double MyFrameworkVersionNumber; //! Project version string for MyFramework.
FOUNDATION_EXPORT const unsigned char MyFrameworkVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import <MyFramework/PublicHeader.h>
#import "MyClass.h"
最后一个设定步骤,是要加入一段Run Script,用来将「仿真器版本Framework」、「实机版本Framework」,整合输出为单一Framework。
参考数据
Run Script
if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi mkdir -p "${INSTALL_DIR}" cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers" lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}" #open "${DEVICE_DIR}"
open "${SRCROOT}/Products"
fi
Setting

完成设定步骤后,分别Build两个不同版本的Framework:仿真器版本、实机版本。接着,设定在建置作业中的Run Script,就会将两个版本的Framework,整合输出为单一的MyFramework.framework
仿真器版本

实机版本

产出MyFramework.framework

使用
接着开启XCode来建立一个新项目:「MyAPP」,专案类型选择为Single View Application。这个项目用来说明,如何使用封装为Framework的程序代码。
专案类型

再来将Framework复制一份,放到MyAPP的专案文件夹内。XCode编译的时候,会去这个路径底下找寻Framework。
Framework档案路径

回到XCode的项目属性页面,把Framework的参考加入到项目里。
加入参考

接着在项目预设的ViewController.m文件里面,加入下列程序来使用Framework里面所封装的程序代码。
加入Framework参考
#import <MyFramework/MyFramework.h>
使用Framework中的程序代码
// test
MyClass* x = [[MyClass alloc] init];
NSString* message = [x getMessage];
完整的ViewController.m
#import <MyFramework/MyFramework.h>
#import "ViewController.h" @implementation ViewController - (void)viewDidLoad { // super
[super viewDidLoad]; // test
MyClass* x = [[MyClass alloc] init];
NSString* message = [x getMessage]; // alert
[[[UIAlertView alloc] initWithTitle:nil message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
} @end
最后,执行MyAPP。可以在执行画面上,看到一个Alert窗口显示从Framework取得的讯息内容,这也就完成了使用Framework的相关开发步骤。
显示回传讯息

后记
XCode编译的时候,会去特定路径底下搜寻Framework来加入编译。如果需要增加或修改参考路径,可以透过调整Build Setting里的Framework Search Paths参数来变更。
Framework Search Paths

范例下载
范例程序代码:下载地址
[iOS] 建立与使用Framework的更多相关文章
- iOS+Swift: 使用MessageUI.framework发送短信
在iOS中, 可以使用MessageUI.framework框架发送短信, 步骤如下: 代码下载http://git.oschina.net/yao_yu/swift_cnblogs_samples/ ...
- iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用
iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用 前言 开发中经常使用三方库去实现某特定功能,而这些三方库通常又分为开源库和闭源库.开源库可以直接拿到源码,和自 ...
- iOS开发之通过Framework建立项目依赖
https://www.jianshu.com/p/d146db167bf3 项目开发时经常会遇到个别模块想打包成framework的情况,传统的打包方式太繁琐,反复测试时很麻烦,不如一个项目管理来得 ...
- IOS静态库和Framework区别
一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系 ...
- 【转】iOS库 .a与.framework区别
转自:http://blog.csdn.net/lvxiangan/article/details/43115131 一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态 ...
- iOS库--.a与.framework
一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态库的差别? 静态库:链接时完整地拷贝至可运行文件里.被多次使用就有多份冗余拷贝. 动态库:链接时不复制.程序执行时由系 ...
- iOS静态库及Framework 创建
本文转自cocoachina,尊重作者的汗水. 讲述的非常透彻,有需要的朋友可以阅读实践.转载请注明出处 //=================以下留着备份==================// 在 ...
- iOS之 opencv3.0.framework
本文章的目的是从源代码包中编译出opencv2.framework供IOS开发使用. 基本上是按照http://docs.opencv.org/3.0-beta/doc/tutorials/intro ...
- WWDC2014之iOS使用动态库 framework【转】
from:http://www.cocoachina.com/industry/20140613/8810.html JUN 12TH, 2014 苹果的开放态度 WWDC2014上发布的Xcode6 ...
随机推荐
- AngularJS快速入门01-基础
记得第一次听说AngularJS这项很赞的Web的前端技术,那时还是2014年,年中时我们我的一个大牛兄弟当时去面试时,被问到了是否熟悉该技术,当时他了解和使用的技术比较多.我们询问他面试情况时,他给 ...
- Nodejs从有门道无门菜鸟起飞教程。
这是一篇菜鸟教程,这是一篇菜鸟教程,如果你是菜鸟到话. 简单来说Nodejs并不是一门新的语言,但是它可以让我们的JS运行在服务器端,在服务器端写JS代码并且输入输出,也就是说以后要是有人问你JS是不 ...
- js对象、数组转换字符串
对象转换成字符串需要使用toString()方法. 1 var a = function(){ 2 console.log(111); 3 }; 4 var b = a.toString(); 5 c ...
- 简单使用AutoMapper实现DTO转换
DTO(Data Transfer Object)数据传输对象,只是传输数据,完成与领域对象之间的转换,并不包含领域业务处理. 当领域模型设计人员只关注核心业务,满足于领域模型的精巧,而不关心具体实现 ...
- structs2之多文件上传
//首先是Action部分import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; i ...
- MYSQL的深入学习--优化步骤
MySql优化的一般步骤 1.通过show status 命令了解各种sql的执行效率 SHOW STATUS提供msyql服务器的状态信息 一般情况下,我们只需要了解以”Com”开头的指令 show ...
- [OpenCV] Samples 10: imagelist_creator
yaml写法的简单例子.将 $ ./ 1 2 3 4 5 命令的参数(代表图片地址)写入yaml中. 写yaml文件. 参考:[OpenCV] Samples 06: [ML] logistic re ...
- JavaScript闭包(二)——作用
一.延迟调用 当在一段代码中使用 setTimeout 时,要将一个函数的引用作为它的第一个参数,而将以毫秒表示的时间值作为第二个参数. 但是,传递函数引用的同时无法为计划执行的函数提供参数.可以在代 ...
- JavaScript之旅(三)
JavaScript之旅(三) 三.函数 在JavaScript中,定义函数的方式如下: function abs(x) { ... return ...; } 如果没有return,返回结果为und ...
- Hyperledger智能合约Hello World示例程序
简介 Hyperledger是Linux 基金会主导的一个开源的区块链(BlockChain)项目. 本文介绍了一个简单的Hyperledger智能合约的开发过程. 开发环境 本文使用Docker作为 ...