iOS静态库实战之Framework

需求

由于喜欢琢磨一些技术,这块领域其实已经好多年就有人发表相关的技术文章,但是自己没有亲手实战一次还真不能说是自己学到这门技术。前段时间研究了一下并动手做了一个静态库。效果挺好,也达到了我想要的预期结果并运用到了我实际项目中。今天重新翻看了一些资料,发现还有完善的地方,特意记录一下,方便后期查阅。

战前准备之.a与.framework库的区别

.a与.framework库的区别

总结:同一个静态库在不同程序中使用时,每一个程序中都得导入一次,打包时也被打包进去,形成一个程序。而动态库在不同程序中,打包时并没有被打包进去,只在程序运行使用时,才链接载入(如系统的框架如UIKit、Foundation等),所以程序体积会小很多,但是苹果不让使用自己的动态库,否则审核就无法通过。

好了,已经了解了两种类型库的区别之后我们就开始动手制作自己的静态库吧。😄

制作Framework静态库

第一步 创建项目

创建Framework项目

第二步 创建需要封装的类或者将需要封装的第三方类加进项目里面

添加或创建封装类

第三步 修改项目配置

1、设置需要公开的头文件


公开的头文件

2、修改生成的Mach-O格式


Mach-O格式

3、将项目的最低支持系统版本设置成iOS 8,可根据自己实际情况设置

最低支持系统版本

  • 这里需要注意的是公开的头文件里 import 了其他类也得添加到 public 中公开出来。如果不想将 import 的类公开出来,那么在头文件中用@class然后在对应的 .m 文件中再 import

  • 需要注意的是默认的Architectures是不包含armv7s,如果需要支持该架构,需要配置一下


    增加armv7s支持

第四步 创建通用静态库执行脚本

1、创建Target


创建Target

2、创建Run Script脚本

创建Run Script脚本

3、编写执行脚本

# Sets the target folders and the final framework product.
# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME

# ----这种方式仅仅适合非pods形式的打包---

# 例如: FMK_NAME = "MyFramework"
FMK_NAME=${PROJECT_NAME}
# FMK_NAME = "TestFamework"
# 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}/"
# 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}"

第五步 选中新建的Target,Run,如果没有异常的话,会自动弹出生成的Framework文件

生成静态库

制作Framework静态库,同时引用第三方类库

我们有时候封装一个静态库可能会引用到第三方的类库,这个时候,如果我们直接将类库封装进入静态库里面的话,刚好其他工程里面也存在这个类库,那么就容易引起冲突。解决的方案也是有的:
方案1:直接修改其中一个类库重命名(这种方式不是很好)
方案2:分离类库,不将第三方类库打入静态库类,只保留引用(此方式要求其他工程手动引入第三方类库)

下面我会以方案2进行实战讲解。

新建工程的步骤同上面是一样的,这里就不多讲,直接从引入第三方类库开始。

方式一:直接拖拽第三方类库到工程并生成静态库

1、将需要的类库拖拽进工程里面


第三方

2、直接在需要使用的地方导入头文件#import "MBProgressHUD.h"

导入头文件并实现相关方法

3、接下来就是跟之前一样用脚本打包的方式生成对应的通用静态库

方式二:通过CocoaPods方式引用第三方类库并生成静态库

1、跟平时使用CocoaPods方式一样,我们在Podfile文件里面写上需要使用的第三方类库

platform :ios, "9.0"
    
target 'TestFramework' do
    pod 'MBProgressHUD'
end

2、之后我们配置下Scheme


配置Scheme

3、分别选择模拟器跟真机编译两个不同版本静态库


编译静态库

4、将编译好的两个.framework静态库用指令合并成一个

lipo -create xFramework-iphoneos.framework/xFramework xFramework-iphonesimulator.framework/xFramework -output /Users/superdanny/Downloads/framework/xFramework(xFramework为合成后的静态库名称)

这里需要注意一点,当我们的-output导出路径参数设置不同时,产生的结果也会不同。

结果1:比如有/Users/superdanny/Downloads/framework这个目录的时候,将导出路径参数设置为/Users/superdanny/Downloads/framework。那么就会产生一个跟framework文件夹同级且同名的framework.lipo的文件。同时终端也会报一个错误,这种情况,我们只需要将后缀.lipo去掉,并且将文件名改为静态库名称。然后执行下文图片中说到的替换操作。

结果2:同样有/Users/superdanny/Downloads/framework这个目录的时候,但是我们将导出路径参数设置为/Users/superdanny/Downloads/framework/xFramework。此时就会在framework文件夹下产生一个名为xFramework的文件。之后我们直接执行下文图片中说到的替换操作即可。

正确的做法应该是用第二种。

指令参数说明

参数 说明
xFramework-iphoneos.framework/xFramework 真机静态库
xFramework-iphonesimulator.framework/xFramework 模拟器静态库
/Users/superdanny/Downloads/framework/xFramework 合成后文件存放路径
替换

大功告成!🎉

验证

最后我们来验证下Framework支持哪些架构,相关指令格式如下:

# 验证Framework
$ lipo -info /Users/.../xFramework.framework/xFramework
# 验证.a
$ lipo -info /Users/.../libXYPlatform.a
# 没有添加armv7s之前的支持架构
$ lipo -info /Users/superdanny/Out/动态包/CoreAppStatus/Products/CoreAppStatus.framework/CoreAppStatus
$ Architectures in the fat file: /Users/superdanny/Out/动态包/CoreAppStatus/Products/CoreAppStatus.framework/CoreAppStatus are: armv7 i386 x86_64 arm64
# 添加armv7s之后的支持架构
$ lipo -info /Users/superdanny/Out/动态包/CoreAppStatus/Products/CoreAppStatus.framework/CoreAppStatus
$ Architectures in the fat file: /Users/superdanny/Out/动态包/CoreAppStatus/Products/CoreAppStatus.framework/CoreAppStatus are: armv7 armv7s i386 x86_64 arm64

应用

我们新建一个工程Test-Framework,然后集成我们的静态库,编写测试用例。

集成并测试

来看看最后集成静态库Demo展示效果:


效果

参考资料

iOS中.a与.framework库的区别
Xcode 6制作动态及静态Framework
关于ios开发framework及.a文件支持架构判断以及合并
iOS Xcode9 封装生成.framework
IOS-静态库(.a、framewrok)、动态库(.tbd、framework)、Bundle制作(适用于静态库的)研究


再一次感谢您花费时间阅读这篇文章!

微博: @Danny_吕昌辉
博客: SuperDanny

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容