[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 ... 
随机推荐
- KnockoutJS 3.X API 第三章 计算监控属性(3) KO如何实现依赖追踪
			KO是如何实现自动更新的 初学者可以掠过该篇,如果你是一个刨根问底的开发者,那本节将告诉你KO是如何实现依赖追踪和UI自动更新的. 其实很简单,KO的依赖追踪算法如下: 当你声明一个计算监控属性,KO ... 
- 关于json序列化和反序列的问题,没事写个案例,希望能帮到那些需要帮忙的朋友!
			现在关于json的读写问题,有许许多多的解决方法,因人而异,根据实际问题去选择自己想要的最容易方法.我觉得自带的Newtonsoft.Json是个不错的选择,随便写两个例子吧! 一:关于简单的json ... 
- struts之动态方法调用改变表单action属性
			一.动态方法调用(DMI:Dynamic Method Invocation) ⒈struts2中同样提供了这个包含多个逻辑业处理的Action,这样就可以在一个Action中进行多个业务逻辑处理 ... 
- HTTP协议从入门到大牛,初识HTTP协议(学习笔记)
			HTTP数据传输协议 当访问一个网页时,浏览器会向服务器发起一条HTTP请求,接着服务器会去寻找相应的资源,如果请求成功,就会把这个对象,对象类型,对象长度以及其他的信息放在HTTP响应中,发送给客户 ... 
- Struts2 DomainModel、ModelDriven接收参数
			一.DomainModel(域模型) 1. 应用场景:一般我们在struts2的action中接收参数通常是如下方式 package cn.orlion.user; import com.opensy ... 
- javascript中数组和字符串的方法比较
			× 目录 [1]可索引 [2]转换 [3]拼接[4]创建[5]位置 前面的话 字符串和数组有很多的相同之处,它们的方法众多,且相似度很高:但它们又有不同之处,字符串是不可变值,于是可以把其看作只读的数 ... 
- js实现打开本地文件或文件夹
			原网址:http://blog.csdn.net/cofesun/article/details/7904887javascript有个特殊的对象ActiveXObject,通过它可以访问window ... 
- Prim算法(三)之 Java详解
			前面分别通过C和C++实现了普里姆,本文介绍普里姆的Java实现. 目录 1. 普里姆算法介绍 2. 普里姆算法图解 3. 普里姆算法的代码说明 4. 普里姆算法的源码 转载请注明出处:http:// ... 
- mysql replication principle--转
			原文地址:http://www.codeweblog.com/mysql-replication-principle/ 1, the replication process Mysql replica ... 
- ASP.NET 路由解析
			这段时间在读园子里Artech大神的<ASP.NET MVC5框架揭秘>,慢慢地从底层了解了MVC模式的设计思路.下面是一些阅读的总结. 传统的Web Forms应用,URL指向的是具体的 ... 
