使用XCode7打包动态库(Framework)
iOS中的静态库和动态库
概念
静态库(Static Library)
以 .a 为后缀,它是你的源码的实现.m文件编译而成的二进制文件集合,需要配合上暴漏的.h文件使用,它在引用链接时拷贝至可执行文件中,程序运行时加载到内存,期间被多次使用就有多份冗余拷贝和加载;
动态库(Dynamic Framework)
以.dylib和.framework为后缀,也是一堆.h和.m的集合,.m同样被编译成了二进制,不同的是,它还可以包含nib文件,资源文件等,系统的framework在链接时先检查内存中是否已经加载,如果有,就不再进行复制,这样多个应用程序可以共享内存中得同一份库文件,节省了内存.
注意:
1.在iOS8之前,或者xcode6之前,你可能也见过开发者自己打包的framework,具体方法可以看这里和这里,但是,这些辛苦打包出来的framework依然是静态库的形式(程序运行时被加载到内存,即便此时内存中其他应用也用了此framework并且已经加载进内存了);
2.系统的.framework是动态库,也就是说我们代码中最常见的#import <Foundation/Foundation.h>
导入的foundation框架,当我们运行程序的时候,其实内存中已经预加载了这些系统框架,此时我们打开应用时不会再次加载这些,这就减少了内存的占用.虽然在xcode6之后苹果爸爸允许我们自己生成framework了,但是,它依然只是存在于当前应用的沙盒中而非提交到系统中,这就意味着每次依然会加载到内存中...
创建自己的framework
相比较于静态库,动态库有着自己的优势,除去上文中说道的资源包含和内存加载问题,在使用的时候相比较于.a的静态库也更方便,因为它本省包含了我们所需要的所有资源(自包含);所以我建议,我们更应该生成动态framework而非.a静态库;
为已有类扩展分类使我们经常的做法,现在我们将实例如何将分类打包成framework使用;
1.新建工程->选择iOS下Framework&Library->CocoaTouch Framework;
2.将我们的要打包的文件拖进工程,这里不要建立文件夹(图1);
可以看到这里有一个额外的文件XCommonExtension.h,它在我们生成工程之后自动为我们生成,这里你可以将打包的public文件都通过import的方式导入头文件到这里,在其他开发者使用framework的时候只用引用这个.h头文件即可;
3.在build phases中,我们可以看到有一个Headers的选项,我们上一步添加的文件都会在这里显示,不过默认的是在project下,这里我们需要把需要暴露的拖动到public下,完成后如下(图2)
4.Build-Run,到此,你的""模拟器版""的framework已经生成了,它只能在模拟器中链接引用,到真机运行的时候就有问题了,接下来,我们在生成真机版的framework,同时把他们合并成一个通用的framework;
5.选中target->在工具栏点击Editor->Add Target->在弹出的选择框中选择Other->Aggregate->Next;现在你的工程总有了两个target(图3)
6.选中刚加入的这个target,点击右上的 + 号 -> New Run Script Phase,我们将在这里嵌入我们的脚本script;
嵌入以下脚本:
# Sets the target folders and the final framework product.
# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME
# 例如: FMK_NAME = "MyFramework"
FMK_NAME=${PROJECT_NAME}
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
# Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
# Cleaning the oldest.
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
cp -R "${SIMULATOR_DIR}/" "${INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
open "${INSTALL_DIR}"
7.选中新加入的这个Scheme,编译运行(图4);
8.编译运行之后你的finder就会弹出生成的framework,找到并拷贝出来,大功告成,下面我们就可以使用它了;
使用我们的framework
9.在新建的工程中加入我们生成的framework,在Embedded Framework中加入我们的framework,在要使用的文件中引入头文件;
import <XCommonExtension/XCommonExtension.h>
注意:
1.这里我们打包的为分类,在使用的时候,需要在other linker flag中添加-ObjC或者-force_load参数;
2.带有图片资源的需要把图片打包成Bundle文件,和framework一起拷贝到相应的项目中.
到此为止,我们制作出来了可供使用的framework,如果想要更多人使用到你的framework,你可以利用cocoaPods,编写自己的PodSpec文件,或者利用Carthage,发布你的framework;
可能导入会存在问题,这里我就一直报错没有这个库文件,可很多方法都试了还是报错.(遗留问题吧!!!)不过framework还是打包成功的.
有知道的可以邮件联系我哟!!
使用XCode7打包动态库(Framework)的更多相关文章
- WWDC2014之iOS使用动态库 framework【转】
from:http://www.cocoachina.com/industry/20140613/8810.html JUN 12TH, 2014 苹果的开放态度 WWDC2014上发布的Xcode6 ...
- 如何打包静态库.framework文件 iOS
代码调试好了开始打包成sdk,下面是将要打包的FRSDK代码(FRSDK.h暴露在外面有别人调用) 1.创建新工程(Xcode File-New-Project) 2.把下面的红色框的东西移除 3.将 ...
- iOS - swift 后使用打包动态库
WWDC2014上发布的Xcode6 beta版有了不少更新,其中令我惊讶的一个是苹果在iOS上开放了动态库,在Xcode6 Beta版的更新文档中是这样描述的: Frameworks for iOS ...
- iOS 开发新版 动态库framework
0. 参考 http://www.cocoachina.com/industry/20140613/8810.html framework+xib参考 : http://blog.csdn.net/x ...
- 动态库 Framework
framework的建立和生成 都比较简单.重点会放在第三块上面(指令集说明及合并) 1.framework target建立 1.1. command + shift + N 选取 ios -> ...
- C 语言与动态库相关基础知识
1.导入文件<>和“”的区别 #include <xxx.h>导入的是标准目录下的.h文件,所谓的标准目录指的是:/use/local/include(一般是第三方头文件)以及 ...
- 静态库 VS 动态库
如何得到库 ①先写好一堆的.c文件(.c:我们所需要的各种工具函数) ②将这些.c编译为对应的.o ③将所有的这些.o打包为一个仓库文件(静态库或者动态库) 静态库:按照静态库的方式打包 动态库:按照 ...
- Linux之动态库
命令规则 lib + 名字 + .so 制作步骤 1)生成与位置无关的代码(生成与位置无关的代码) 2)将.o打包成共享库(动态库) 发布和使用共享库 动态库运行原理: 生成动态库: gcc -fPI ...
- iOS 使用 Xcode8 制作动态库及静态库
在使用第三方 SDK 时,经常遇到他们提供的仅仅只有一个动态或静态库,并不能获取源码.使用动态库 FrameWork 或 静态库 Lib,可以满足不想把核心代码的具体实现向使用者展示,又能避免其他人错 ...
随机推荐
- Excel 教程一
俗话说,工欲善其事,必先利其器,那么我们今天就先来看一下这个excel软件的一些主要功能菜单. 一.功能区菜单 功能区菜单主要包括: 文件菜单: 主要用于新建文件,保存文件,另存为文件,打开文件,打 ...
- webSocket的场景应用
应用场景 服务器更新 前端页面也进行局部刷新,更新服务器端返回的信息 什么是webSocket? 它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对 ...
- Paper Reading:ION
Inside-Outside Net (ION) 论文:Inside-Outside Net: Detecting Objects in Context with Skip Pooling and R ...
- python_并发编程——进程池
1.进程池 from multiprocessing import Pool def func(n): for i in range(10): print(n+1) if __name__ == '_ ...
- JSON 初探
Json是什么? JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小 ...
- C# 加载显示ftp上图片方法
ftp://用户名:密码@IP/路径 FTP的一种登陆方式 如ftp://sing:song@192.168.1.133/upload/pic/236.jpg
- resize([[data],fn]) 当调整浏览器窗口的大小时,发生 resize 事件。
resize([[data],fn]) 概述 当调整浏览器窗口的大小时,发生 resize 事件. 参数 fnFunctionV1.0 在每一个匹配元素的resize事件中绑定的处理函数.直线电机 ...
- mysql查看查询缓存是否启用
查看查询缓存情况: mysql> show variables like '%query_cache%'; (query_cache_type 为 ON 表示已经开启) +---------- ...
- Laravel 5.8: Automatic Policy Resolution
Laravel 5.8: Automatic Policy Resolution March 26, 2019 One of the new features in Laravel 5.8 allow ...
- LibreOJ #113. 最大异或和
二次联通门 : LibreOJ #113. 最大异或和 /* LibreOJ #113. 最大异或和 线性基 插入 与 查询最大值 说一下我在学习线性基时遇到的一些问题 1.线性基指的是一个数集 2. ...