新建项目 Products 目录不显示
创建了一个framework,如下图,目录结构下不显示Products
打开工程里面的,显示包内容
搜索productRefGroup关键字
将上面mainGroup对应的值复制给productRefGroup的值
-
创建Framework项目
2.配置项目的目标平台版本
3.在Framework中添加需要的代码和资源文件。
如果需要对外提供API接口,需要再public访问级别的类或方法前添加public关键字。
将对外暴漏的头文件(如Objective-C中的头文件)防止到“Public”区域,以便在外部项目中可以访问。
资源文件(如图片、xib文件)可以添加到Framework的资源目录中,并在编写代码时通过Bundle加载。
设置对外暴露文件
4.配置构建信息(Build Setting和Build Phases)
设置 Defines Module,确保其设置为 Yes。这允许Xcode为你的Framework创建模块接口。
设置 Build Libraries for Distribution为 Yes。这会确保生产 .swiftinterface文件,允许其他Swift项目使用你的Framework时查看公共接口,而隐藏实现细节。
设置Build Active Architecture Only,通常在Debug配置下设置为Yes,在Release配置下设置为No。
设置Architectures:确保包含arm64和x86_64,以支持设备和模拟器。
设置Mach-O Type为动态库或者静态库,首次尝试的伙伴可以先选择静态库(Static Library)。
设置需要暴漏的文件(Build Phases)。
5.打包Framework
在Xcode的左上角选择目标设备,可以选择“Any iOS Device (arm64)”来编译适用于真机的版本,或者“Any iOS Simulator Device(arm64,x86_64)”。
运行或编译项目,编译完成后点击菜单栏的“Product” -> "Show Build Folder in Finder"。
在build目录找到Products文件里面会有对应模拟器或是真机对应的Framework。
每个Framework都可以单独使用,也可以使用lipo工具将多个架构的二进制文件合并成一个单一的Framework。
如果需要配置pch
$(SRCROOT)/项目名称/PrefixHeader.pch
遇到比较坑的问题
1.开放到public 的.h文件中引入其他的.h文件也需要 开放到pulbic,不然会报错找不到这个文件
2.解决无法识别framework中分类(类别拓展)方法(unrecognized selector sent to instance)的问题:
在引入framework的工程
解决方法是在Xcode target的Build Settings下Other Linker Flags里面加入-ObjC标志。
之所以使用该标志,和Objective-C的一个重要特性:类别(category)有关。根据这里的解释,Unix的标准静态库实现和Objective-C的动态特性之间有一些冲突:Objective-C没有为每个函数(或者方法)定义链接符号,它只为每个类创建链接符号。这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现"selector not recognized",也就是找不到方法定义的错误。为了解决这个问题,引入了-ObjC标志,它的作用就是将静态库中所有的和对象相关的文件都加载进来。
-all_load和-force_load
在64位的Mac系统或者iOS系统下,链接器有一个bug,会导致只包含有类别的静态库无法使用-ObjC标志来加载文件。变通方法是使用-all_load 或者-force_load标志,它们的作用都是加载静态库中所有文件,不过all_load作用于所有的库,而-force_load后面必须要指定具体的文件。
---------------------------制作bundle--------------------------
1.新建项目,选择macOS ---> Bundle
2.因为Bundle默认是macOS系统的,所以我们要修改他的属性
3.修改Build Setting中COMBINE_HIDPI_IMAGES属性为NO。否则Bundle图片格式就会为tiff格式。
4.作为资源包只需要编译就好,不需要安装相关配置,设置Skip Install的值为YES,同时删除Installation Directory的键值
5.把图片拉进Bundle中,选择真机模式,command + B,右键Show in Finder,可以看到我们生成的Bundle文件。
6.把Bundle文件导入到我们的framework中,我们用到图片的时候,就取Bundle中的图片来用。使用时注意,具体用法
NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"Bundle" withExtension:@"bundle"]];
UIImage *image = [UIImage imageNamed:imName inBundle:bundle compatibleWithTraitCollection:nil];