iOS之如何创建.framework静态库

番外:想要查看如何创建.a静态库可前往看我iOS之如何创建.a静态库-CSDN博客这篇文章。

一、创建framework项目

  1. 创建framework工程要选择iOS --> Cocoa Touch Framework
  2. 输入项目名称PrintFramework也是编译生成的framework的名称。
  3. framework的名称也可以以后在项目中更改
  4. 将需要打包成framework静态库的文件资源等拖拽进该项目。

二、配置framework

1. Build Settings 配置
  1. Product Name: 最终编译出来的Framework文件的名称
  2. Mach_O Type: 选中static Library(静态库)
  3. Architectures :支持的CPU指令集
  4. Build Active Architecture Only: 设置为NO
  5. Base SDK: 选择iOS
  6. iOS Deployment target:framework支持的最低iOS版本
2. Build Phases 配置
  1. Link Binary With Libraries中添加项目的依赖库
  2. Compile Sources:framework 中包含的实现代码
  3. Copy Bundle Resources:项目中使用到的资源文件,图片,XIB文件,plist文件等 (建议将资源文件放到新建的Bundle中,下面会介绍Bundle的创建和使用)
  4. headers:将需要暴露出来的头文件添加到public分组下,需要隐藏的头文件添加到project分组下

三、创建Bundle

如果项目中用到了图片、Xib等资源时需要创建一个Bundle:File - New - Target - macOS - Bundle。

温馨提示

在创建Bundle时的名称不能和framework的名称一样,一样会导致失败。
配置Bundle

  • 选中BundleTarget,Product Name - 修改Bundle名称,博主这里叫PrintFramework

  • Base SDK:修改为iOS

  • Supported Platforms:修改为iOS

  • Enable Bitcode:设置为NO

  • COMBILE_HIDPI_IMAGES:设置为NO。(避免Bundle中的图片变成tiff格式而无法使用)
    将创建好的Bundle添加到framework项目的依赖中去。

五、使用Bundle

在framework中使用bundle中的资源不能直接通过资源的名称来获取。

objectivec 复制代码
[UIImage imageNamed:@"logo.png"];

这种方法获取不到logo.png图片。

正确的方式是:先获取到bundle的路径,然后再将资源文件的路径拼接到bundle路径后面才能获取到资源。如下

objectivec 复制代码
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"PrintFramework.bundle" ofType:@"bundle"];
NSString *imagePath = [bundlePath stringByAppendingString:@"/logo.png"];
UIImage *image = [UIImage imageNamed:imagePath];

六、编译项目

编译生成framework静态库之前先将framework对应的scheme中的run 的值改成 Release

编译真机项目
  1. 在设备列表中选中Generic Device
  2. 使用快捷键 CMD + B 编译项目
编译模拟器项目
  1. 在设备列表中选择一个模拟器
  2. 使用快捷键 CMD + B 编译项目

之后会看到在products 分组下的PrintFramework.framework变成黑色。

选中PrintFramework.framework右键,选择Open In Finder 可以看到编译好的两个bundle文件。

七、合成模拟器和真机通用的framework静态库

之前编译生成的两个静态库分别支持模拟器和真机的使用。但是在实际开发中需要即支持模拟器又支持真机使用的静态库怎么办?这个问题当然可以解决,那就是将两个静态库合并生成一个通用的静态库。可以在mac终端中使用下面的命令合成

objectivec 复制代码
lipo -create path1/PrintFramework.bundle/PrintFramework path2/PrintFramework.bundle/PrintFramework -output path3/PrintFramework

path1和path2分别是模拟器和真机的静态库的路径。path3是合成之后的文件的存放路径。

八、framework 的使用

  1. 将framework拖入到要使用framework的工程,并在项目的Build PhasesLink Binary Resources中添加framework。

  2. framework使用到的Bundle要添加到工程的Copy Bundle Resources中。不然项目是找不到Bundle中的资源文件的,那么Bundle也就无法正常使用资源文件。

  3. 如果framework中使用到了Category 那么在使用framework的工程中要设置 Build Settings中的Other Link Flag-ObjC或者-all_load

  4. 如果framework有使用系统库,那么也要在使用framework的工程中将这些系统库添加到工程中。不然会报编译错误

相关推荐
2401_8658548812 小时前
iOS应用想要下载到手机上只能苹果签名吗?
后端·ios·iphone
HackerTom1 天前
iOS用rime且导入自制输入方案
ios·iphone·rime
良技漫谈1 天前
Rust移动开发:Rust在iOS端集成使用介绍
后端·程序人生·ios·rust·objective-c·swift
2401_852403551 天前
高效管理iPhone存储:苹果手机怎么删除相似照片
ios·智能手机·iphone
星际码仔2 天前
【动画图解】是怎样的方法,能被称作是 Flutter Widget 系统的核心?
android·flutter·ios
emperinter2 天前
WordCloudStudio:AI生成模版为您的文字云创意赋能 !
图像处理·人工智能·macos·ios·信息可视化·iphone
关键帧Keyframe2 天前
音视频面试题集锦第 8 期
ios·音视频开发·客户端
pb82 天前
引入最新fluwx2.5.4的时候报错
flutter·ios
袁代码2 天前
Swift 开发教程系列 - 第4章:函数与闭包
ios·swift·ios开发
#摩斯先生3 天前
IOS 防截屏实现
ios·xcode