[iOS] 建立与使用Framework

前言

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

建立

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

  • 专案类型

接着在MyFramework加入一个新类别:「MyClass」,做为提供给其他开发人员使用的程序代码。

  • MyClass.h

    1. #import <Foundation/Foundation.h>
    2. @interface MyClass : NSObject
    3. // methods
    4. - (NSString*) getMessage;
    5. @end
  • MyClass.m

    1. #import "MyClass.h"
    2. @implementation MyClass
    3. // methods
    4. - (NSString*) getMessage {
    5. return @"Clark";
    6. }
    7. @end

建立好MyClass之后,接着要把MyClass.h设定为Public,让使用的开发人员可以加入类别的.h档参考。

  • Public Headers

接着在项目预设的MyFramework.h里面加入MyClass.h档的参考,让后续使用的开发人员只要import单一个MyFramework.h檔,就可以引用到Framework里Public出来的.h檔。

  • MyFramework.h

    1. #import <UIKit/UIKit.h>
    2. //! Project version number for MyFramework.
    3. FOUNDATION_EXPORT double MyFrameworkVersionNumber;
    4. //! Project version string for MyFramework.
    5. FOUNDATION_EXPORT const unsigned char MyFrameworkVersionString[];
    6. // In this header, you should import all the public headers of your framework using statements like #import <MyFramework/PublicHeader.h>
    7. #import "MyClass.h"

最后一个设定步骤,是要加入一段Run Script,用来将「仿真器版本Framework」、「实机版本Framework」,整合输出为单一Framework。

  • 参考数据

  • Run Script

    1. if [ "${ACTION}" = "build" ]
    2. then
    3. INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
    4. DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
    5. SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
    6. if [ -d "${INSTALL_DIR}" ]
    7. then
    8. rm -rf "${INSTALL_DIR}"
    9. fi
    10. mkdir -p "${INSTALL_DIR}"
    11. cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
    12. #ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"
    13. lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
    14. #open "${DEVICE_DIR}"
    15. open "${SRCROOT}/Products"
    16. 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参考

    1. #import <MyFramework/MyFramework.h>
  • 使用Framework中的程序代码

    1. // test
    2. MyClass* x = [[MyClass alloc] init];
    3. NSString* message = [x getMessage];
  • 完整的ViewController.m

    1. #import <MyFramework/MyFramework.h>
    2. #import "ViewController.h"
    3. @implementation ViewController
    4. - (void)viewDidLoad {
    5. // super
    6. [super viewDidLoad];
    7. // test
    8. MyClass* x = [[MyClass alloc] init];
    9. NSString* message = [x getMessage];
    10. // alert
    11. [[[UIAlertView alloc] initWithTitle:nil message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
    12. }
    13. @end

最后,执行MyAPP。可以在执行画面上,看到一个Alert窗口显示从Framework取得的讯息内容,这也就完成了使用Framework的相关开发步骤。

  • 显示回传讯息

后记

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

  • Framework Search Paths

范例下载

范例程序代码:下载地址

[iOS] 建立与使用Framework的更多相关文章

  1. iOS+Swift: 使用MessageUI.framework发送短信

    在iOS中, 可以使用MessageUI.framework框架发送短信, 步骤如下: 代码下载http://git.oschina.net/yao_yu/swift_cnblogs_samples/ ...

  2. iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用

    iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用 前言 开发中经常使用三方库去实现某特定功能,而这些三方库通常又分为开源库和闭源库.开源库可以直接拿到源码,和自 ...

  3. iOS开发之通过Framework建立项目依赖

    https://www.jianshu.com/p/d146db167bf3 项目开发时经常会遇到个别模块想打包成framework的情况,传统的打包方式太繁琐,反复测试时很麻烦,不如一个项目管理来得 ...

  4. IOS静态库和Framework区别

    一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系 ...

  5. 【转】iOS库 .a与.framework区别

    转自:http://blog.csdn.net/lvxiangan/article/details/43115131 一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态 ...

  6. iOS库--.a与.framework

    一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态库的差别? 静态库:链接时完整地拷贝至可运行文件里.被多次使用就有多份冗余拷贝. 动态库:链接时不复制.程序执行时由系 ...

  7. iOS静态库及Framework 创建

    本文转自cocoachina,尊重作者的汗水. 讲述的非常透彻,有需要的朋友可以阅读实践.转载请注明出处 //=================以下留着备份==================// 在 ...

  8. iOS之 opencv3.0.framework

    本文章的目的是从源代码包中编译出opencv2.framework供IOS开发使用. 基本上是按照http://docs.opencv.org/3.0-beta/doc/tutorials/intro ...

  9. WWDC2014之iOS使用动态库 framework【转】

    from:http://www.cocoachina.com/industry/20140613/8810.html JUN 12TH, 2014 苹果的开放态度 WWDC2014上发布的Xcode6 ...

随机推荐

  1. jS事件之网站常用效果汇总

    下拉菜单 <!--简单的设置了样式,方便起见,将style和script写到同一个文档,着重练习事件基础--> <!DOCTYPE html> <html> < ...

  2. Index Seek和Index Scan的区别

    Index Seek是Sql Server执行查询语句时利用建立的索引进行查找,索引是B树结构,Sql Server先查找索引树的根节点,一级一级向下查找,在查找到相应叶子节点后,取出叶子节点的数据. ...

  3. ASP.NET MVC 4使用PagedList.Mvc分页

    ASP.NET MVC中进行分页的方式有多种,在NuGet上有提供使用PagedList.PagedList.Mvc进行分页. 1. 通过NuGet引用PagedList.Mvc 在安装引用Paged ...

  4. [Qt5] Develop openCV3 by QML on Qt-creator

    QML的酷炫控件,适合移动设备开发. qt-creator的跨平台是QML与opencv的粘合剂. 关键: QImage有若干种格式,转化为相应的Mat. Mat处理完后,还要正确得还原为原来格式的Q ...

  5. ISTool5.3.1汉化版使用教程

    ISTool是帮助你创建由Jordan Russell制作的Inno Setup编译器脚本的工具.Inno是一个出色的编译器,即使对于某些专业的安装制作程序,它唯一的缺点就是它的脚本必须手动编写. 这 ...

  6. NODE.JS之我见

    NODE.JS之我见 先说说为什么有这篇文章,关注NODE.JS 也有一段时间了,不敢说大彻大悟,但是对于NODE.JS能干什么,还是有一定的了解,笔者多年以前就研究过JavaScript引擎V8,可 ...

  7. Mybatis逆向生成

    在已经有了数据库的表的时候,为了方便起见,我们可以逆向生成javabean,xml,dao接口等,当然,下载mybaits-generation的工具,我这里用的是eclipse插件,然后准备一 个x ...

  8. java并发编程(4)--线程池的使用

    转载:http://www.cnblogs.com/dolphin0520/p/3932921.html 一. java中的ThreadPoolExecutor类 java.util.concurre ...

  9. 配置springmvc在其他类中(spring容器外)获取注入bean

    学习https://github.com/thinkgem/jeesite 今天在写JedisUtils的时候要注入JedisPool,而这个属性被设置为static,@Resource和@Autow ...

  10. JavaScript变量和数据类型

    变量 变量就是一个元素,类似于数学中的概念,用来指定表示一个对象.在JavaScript中,用来指定变量的关键字为var.当声明新变量时,可以使用关键词 "new" 来声明其类型 ...