iOS SDK Framework封装

一.Framework工程和设置

普通Framework工程需要做的设置,target中

(一).General-Deployment Info, 设置为iOS10

(二)Build Setting中添加设置

1.Build Active Architecture Only 置为NO,意思是不能只编译当前CPU架构
2.Mach-O Type 改为静态库Static Library
3.BitCode改为NO(可选)
3.如果Framework中有category,那需要在宿主工程(Framework工程不用改?)中的setting-other linker flags添加参数: -ObjC (如果还不行的话,就用-all_load或者-force_load)

(三).其他文档提到的设置,setting中:

dead code stripping 改为NO. 开启会对代码中的”dead”、”unreachable”进行过滤, 导致不完整, 建议设置NO,也有文章说可以包瘦身
link with standard libraries改为NO,避免重复链接

(四).Build Phase中

类文件的target,可以选是否公开
Headers-Public,公开头文件
Headers-Private,私有头文件
Headers-Project,非公开的头文件一般放到这里就行

二.类文件

所需要的类文件扒下来,放到Framework工程中
导入头文件,可以用@class

三.资源文件

最好全局搜索bundle,image,xib,修改所有涉及到的bundle,image,xib等等

(一).制作Bundle包的方式:

1.把一个文件夹直接改名为xxx.bundle就行
2.File-new-project,macOS下,有个bundle. 然后在bundle工程里,setting-Base SDK改为iOS
方式1和方式2好像有一定区别: iOS SDK开发汇总

(二).Bundle包路径

  1. 和Framework包平级
  2. 把Bundle包放到Framework包中
    貌似放到Framework中有问题iOS- SDK开发注意事项记录

(三).往Bundle里添加资源:

1.如果是需要保持文件夹层级的,拖到工程时,勾选Create Folder References. 例如html文件夹,里面的css,js,资源图片,有可能需要保持层级
2.有的文章不推荐使用Assets或者Image Set,创建的名称与图片的真实名称可能不一样,用的时候会找不到目标资源

(四).Bundle工程设置:

如果是用方式2, File-new-project-bundle这种方式创建的bundle,好像会有个问题,会把图片转成tiff格式,所以获取不到图片. setting-COMBINE_HIDPI_IMAGES改为NO
iOS 项目打包framework

(五).获取资源, 资源加载方式

基本都是先拿到bundle包路径,然后再通过bundle加载资源
1..图片image:
获取图片
方式1,在图片名字里拼接bundle路径:

//如果是.png格式的,ImageName不需要带后缀,否则需要带上后缀
NSString* imagePath=[[[NSBundle mainBundle] pathForResource:@"BundleName" ofType:@"bundle"] stringByAppendingPathComponent:@"ImageName"];
UIImage* image=[UIImage imageNamed:imagePath];

方式2,传入bundle路径,在bundle里获取图片:

[UIImage imageNamed:name inBundle:[NSBundle xxxbundle] compatibleWithTraitCollection:nil]

相关文章
iOS - framework开发资源图片如何配置
iOS Framework 使用.xcassets 图片资源

2.xib/nib
方式1,找到bundle路径,然后获取xib:

NSBundle* bundle=[NSBundle bundleWithPath:[[NSBundle mainBundle]pathForResource:@"BundleName" ofType:@"bundle"]];
[self.accountListTableView registerNib:[UINib nibWithNibName:@"XibName" bundle:bundle] forCellReuseIdentifier:@“celID”];

方式2,根据类寻找bundle,然后加载:

[[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:[NSBundle bundleForClass:[self class]]];

四.Cocoapods三方库依赖,及重名问题

NameSpace冲突,如果Framework里有AFNetworking或SDWebImage等常用的三方库,宿主工程也使用这些三方库,就会导致冲突,解决方式有几种,比较推荐方式3:
1.手动导入,全部改名,工作量较大,而且会让包比较大
2.打包后通过命令剥离.o文件
iOS项目中引用多个第三方库引发冲突的解决方法
3.在Framework工程中用cocoapods安装三方库
NameSpace冲突,如果Framework里有AFNetworking或SDWebImage等常用的三方库,宿主工程
如何打包一个依赖第三方framework(如支付宝的framework)的静态framework
如何打包一个依赖AFNetworking的静态framework
详细记录:iOS制作framework(包含第三方.a或framework的二次封装)

五.依赖其他Framework

iOS制作Framework依赖第三方Framework

五.OC与Swift混编

Swift类中,使用public或open关键字让需要暴露的类/方法/属性暴露出来
参考这里
封装含有pod依赖,并且OC与Swift混编的framework

六.导包,合并包

导包一般是要把模拟器和真机包合并.但是xcode12之后,兼容了m系列芯片的mac机器,也就是说真机包含arm64架构,模拟器也包含了arm64架构,会导致冲突报错,需要做如下设置:setting-Excluded Architectures中添加arm64,参考文章
iOS | 自制framework详细图文流程介绍
关于Xcode12静态库打包的一些心得
Xcode 12打包framework 报错:have the same architectures (arm64) and can't be in the same fat output file
1.手动合并包
Scheme中选中Any iOS Device是导出真机包,选中模拟器是导出模拟器的包
合并真机和模拟器的包: lipo -create 模拟机和真机的framework同名文件路径(直接拉到终端就会显示)-output 一个输出路径 ,然后把输出的文件改名,并替换Framework中的同名文件
2.脚本合并
其实和第一种方法一样,只不过是脚本操作,自动化了
【潮汐-framework真机模拟器合并】iOS开发:iOS SDK 从开发到发布
IOS SDK制作
3.xcodebuild命令
生成XCFramework

七.联调,调试

Framework里修改了代码,或者bundle包里删减了资源,编译后应该自动是最新状态; 能断点调试; 能持续集成demo
【潮汐】iOS开发 静态库关联demo 多工程联调
iOS Framework——开发及调试
iOS-制作frameworkDemo工程(framework开发打包和调试)

八.持续集成

iOS开发:iOS SDK 从开发到发布

九.宿主工程设置

Info中添加App Transport Security Settings,支持http链接
setting-Header Search Paths

十.其他格式

XCFramework
xcframework生成与使用
使用XCFramework的注意点

十一.报错及坑


参考文章:
封装含有pod依赖,并且OC与Swift混编的framework
iOS Xcode7 制作Framework
iOS Framework的创建以及其中xib文件和图片资源的引用
iOS | 自制framework详细图文流程介绍
Xcode中other linker flags的作用
ios封装自己的framework
iOS开发framework的创建
ios开发:Xcode8制作framework及使用
iOS 制作framework(SDK)的流程
iOS中 Framework静态库的创建和使用遇到的那些坑 韩俊强的博客
系列文章
IOS SDK项目打包成Framework静态库
ios swift 创建framework(八) static Library framework 嵌套framework

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

推荐阅读更多精彩内容