一.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包路径
- 和Framework包平级
- 把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
五.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开发打包和调试)
八.持续集成
九.宿主工程设置
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