iOS开发制作静态库framework

参考博客:
https://www.jianshu.com/p/be31100f7a19
https://blog.csdn.net/baidu_34159638/article/details/52289229

SDK开发注意点: https://www.jianshu.com/p/a3ff1d5bd761

一、新建工程

image.png
image.png
image.png

二、工程配置

点击目标工程 >> 选择你创建的Framework >> 点击工程设置 >> 做出如下修改

  • General >> Deployment Info
    将SDK支持的系统和平台改为自己需要的。

  • 选择工程文件>>target第一项>>Build Setting>>搜索linking,然后几个需要设置的选项都显现出来,首先是Dead Code Stripping设置为NO,网上对此项的解释如下,大致意思是如果开启此项就会对代码中的”dead”、”unreachable”的代码过滤,不过这个开关是否关闭,似乎没有多大影响,不过为了完整还原framework中的代码,将此项关闭也未曾不可。
    然后将Link With Standard Libraries关闭,我想可能是为了避免重复链接

  • Build Settings >>Build Active Architecture Only设置为NO。 如果设为YES,会导致其编译时只生成当前机器的框架;将其设置为NO后,发现用模拟器编译后生成的framework同时包含x86_64和i386架构。

  • Build Settings -> Excluded Architectures里按照这样设置一下。因为xcode12生成的模拟器版本静态库会多包含一个arm64架构,这样会妨碍后面模拟器版本和真机版本合并,这样设置就可让模拟器版本没有arm64架构。

image.png
  • Build Settings >> Mach-O Type >> Static Library
    对于Mach-O Type有两种情况:(1)选择 Static Library 打出来的是静态库;(2)选择 Relocatable Object File 打出来是动态库。

设置为静态库

image.png

三、资源文件的管理

开发SDK我们使用图片 gif 资源文件等文件时,要放在bundle文件里存放,新建bundle文件很简单,创建一个文件夹,将后缀名改为.bundle就可以了。

我创建了一个名为XLXADResource.bundle的文件,将图片等文件都放在这里使用。

image.png

如何使用bundle文件里的文件呢?

加载图片

UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"XLXADResource.bundle/%@", name]]

获取文件先找到真实路劲,然后转化为data,再转为其他格式

NSString * bundlePath = [[NSBundle mainBundle] pathForResource:bundleName ofType:@"bundle"];
NSBundle * bundle = [NSBundle bundleWithPath:bundlePath];
NSString * filePath = [bundle pathForResource:fileName ofType:fileType];
NSData *data = [NSData dataWithContentsOfFile:filePath];
if ([fileType isEqualToString:@"png"] || [fileType isEqualToString:@"jpg"]) {
    UIImage *image = [UIImage imageWithData:data];
 }

四、添加打包需要的文件

把需要打包的文件拖到工程中来,所有全局变量,宏,文件需要带前缀,分类的方法,属性都需要带前缀,防止冲突。

我的SDK用了三个文件夹,分别是
libs : 存放依赖的第三方
SDK :我自己写的代码,包括界面,分类,宏
XLXADResource.bundle :存放图片 gif等资源文件

image.png

如何处理依赖的第三方?

开发SDK中难免需要用到其他的第三方,如果将第三方文件打包到SDK里,万一其他项目在集成我们SDK,项目里已经有相同的第三方,那么就会导致冲突。这种情况我们需要处理。
尽量不要将第三方库打包进 SDK,如果要打包,最好也要将该第三方库所有文件和分类方法、属性重命名,以避免冲突。

方法一:将SDK和依赖的第三方分离

将第三方拖到工程后,不要选择Add to targets,这样打包出来的framework就不会包含这些第三方文件。

image.png

那别人在集成我们的SDK时,就需要再集成一下我们所依赖的第三方,这样才能运行。

方法二:修改第三方的所有文件类名

如果第三方文件较少,那完全可以将所有的文件名修改名字,通常第三方都有固定的前缀,将所有前缀替换就可以了。这样的操作需要谨慎,最好提前备份好代码,防止替换后出现错误。

五、暴露头文件

在target >> Build Phase >> Headers里将需要暴露的头文件从project栏拖到public栏里

image.png

六、开始打包

快捷键shift + command + ,选择运行模式(debug 或 Release)分别在真机和模拟器下common + B 编译生成对应的Framework库,在Products里可以得到四个framework

image.png
获得的四种SDK

查看静态库支持的架构

打包出来的SDK,可以用终端命令 lipo -info + 静态库路径查看它所支持的架构

静态库路径.png
查询模拟器静态库支持架构命令.png

模拟器版本的支持 x86_64 和 i386架构 ,如果这里还有一个arm64架构说明在第二步工程配置里 Excluded Architectures 没有配置好

查询真机静态库支持架构命令.png

真机版静态库支持arm64和 armv7架构。

模拟器和真机静态库合并

终端使用命令 lipo -create + 真机静态库路径 + 模拟器静态库路径 + -output + 合成后文件的输出路径(直接使用模拟器或者真机的SDK的路径即可,不用再创建新的文件夹)

合并命令.png

再次查询合并后的静态库支持架构,已经是支持armv7 i386 x86_64 arm64所有架构了。

查询合并静态库支持架构.png

至此,framework已经打包完成,可自行决定是将模拟器版本还是真机版本还是合并版本提供给别人。

七、集成使用SDK

  • 加入SDK
    打包出来的SDK,可以看到里面有这几个文件,将SDK拖到工程中
image.png

注意bundle文件要单独,再拖到工程里,(不需要再勾选copy items if needed)否则图片加载不出来

image.png
  • 如果SDK依赖于其他第三方,需要先安装依赖的第三方。

  • 如果SDK内使用了分类,那么其他项目在接入这个SDK时,要在build settings里为Other Linker Flags 添加 -ObjC


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