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的工程中将这些系统库添加到工程中。不然会报编译错误

相关推荐
ch_ziyuan40 分钟前
2026新优化神马TV8.5影视点播系统保姆级搭建教程:三后台配置+反编译修改
android·ios·php
2601_955767421 小时前
观复盾 iPhone 17 Pro 护景贴深度评测:参数解析与实测避坑
人工智能·ios·ar·iphone·圆偏振光·磁控溅射
一拳一个娘娘腔3 小时前
【SRC漏洞挖掘系列】第11期:移动端安全(Android/iOS)—— APP 里的“猫腻”大起底
android·安全·ios
学习3人组4 小时前
IOS手机使用电脑代理 IP 作为网关/代理出口实现穿越上网
tcp/ip·ios·智能手机
2501_915106324 小时前
深入解析HTTPS抓包原理、中间人攻击及反抓包技术攻防
数据库·网络协议·ios·小程序·https·uni-app·iphone
ch_ziyuan5 小时前
跨平台APP封装分发系统搭建:iOS免签+安卓防报毒+IPA签名一体化
android·ios
游戏开发爱好者85 小时前
React Grab工具详解:AI助力Vue3、Svelte和Solid前端元素调试
android·ios·小程序·https·uni-app·iphone·webview
UXbot5 小时前
初创公司如何选择合适的UI工具支撑快速迭代产品?
人工智能·低代码·ios·交互·原型模式
CodeForCoffee5 小时前
iPhone照片导入Mac
macos·ios·iphone
Digitally5 小时前
如何将数据从传音(TECNO)手机迁移到 iPhone?
ios·智能手机·iphone