Swift项目生成Framework流程以及与OC的区别 - 详解

news/2025/11/30 13:39:43/文章来源:https://www.cnblogs.com/gccbuaa/p/19289161

一. 引言

Swift 已经成为 iOS 开发的主流语言,在实际项目中,打包成 Framework(二进制框架) 已经是模块化、组件化开发的常见需求。

对于 Objective-C 而言,制作 Framework 几乎是轻车熟路的流程:只需设置好暴露头文件,一切都能顺利调用。

但当我们用 Swift 来生成 Framework 时,对于新手而言往往会遇到各种让人困惑的问题——

比如:

  • 源码似乎被“暴露”出去了?
  • 明明设置了暴露文件却依旧无法访问?
  • public、internal 的边界到底是如何决定的?

在本篇文章中,我们将以一个“播放器”为例,从零开始讲解 Swift 项目生成 Framework 的完整流程,并重点分析它与 Objective-C 在模块暴露机制、访问控制以及编译产物结构上的区别。希望读完之后,你能彻底搞懂 Swift Framework 打包背后的逻辑。

二. 生成步骤

接下来我们就以一个“播放器”为例,演示如何从零开始创建并打包一个 Swift Framework。

在这个示例中,我们将创建一个名为 PlayerFramework 的框架,用来模拟一个简单的播放器逻辑。

其中会包含:

  • 两个公开方法:play() 和 pause() —— 对外提供播放与暂停功能。
  • 一个私有方法:loadMediaFile()加载资源,仅供框架内部使用。

完成后,我们会将生成的 .framework 文件导入到另一个示例项目中进行测试,确保外部调用正常、私有方法不可访问。

2.1 创建Framework工程

对于创建工程的步骤OC项目和Swift项目到的确是没有什么区别。

新建一个Project,菜单栏选择“iOS” ,向下拉到“Framework & Library”然后选择Framework。

然后输入 “Product Name” 选择 “Team”等等信息,Most important of all ,“Language”要选择Swift,不然就该去看OC教程了。

创建好的工程目录结构如下:

1. 最上面的 PlayerFramework 工程的根目录。

2. PlayerFramework 文件夹 是源码文件,这个目录才是 真正的代码与配置文件所在位置,一般包括:

  • PlayerFramework.h
  • Swift 源文件(比如稍后你要放的 PlayerHelper.swift)
  • Info.plist(框架的配置文件)

PlayerFramework.h:

这个是 Umbrella Header(总头文件),在 Objective-C 框架中非常重要,用于声明哪些符号对外暴露。

但在 纯 Swift Framework 中,这个文件基本不会起作用,

因为 Swift 的符号暴露完全由关键字 public / internal / private 控制。

3. PlayerFramework( 图书馆图标)

这是 编译产物文件夹(Build Products),也就是编译完成后生成的真正的 .framework 文件。

每次你在 Xcode 里 Build 后,系统会在这里生成一份新的 Framework。

它一般包含:

  • 一个 “ 图书图标” 的文件:这是实际的二进制可执行文件(PlayerFramework 本体),内部就是 Swift 编译器输出的 .o 链接产物。
  • 一个 Resources/ 文件夹:存放资源文件(图片、plist、json等),如果你的框架带有资源就会放在这里。
这个文件夹并不是你自己维护的,而是 Xcode 自动生成的 编译产物

2.2 构建PlayeHelper类

接下来,我们来创建一个示例类 —— PlayerHelper,用来模拟播放器的核心逻辑。在这个例子中,我们会定义两个对外暴露的公共方法:play() 和 pause(),同时在内部实现一个私有的加载方法 loadMediaFile()。

文件位置

该文件应该在“PlayerFramework”文件夹下与 “PlayerFramework.h”同级。

PlayerHelper.swift 示例代码

代码内加了完整的注释,需要注意的是整个类需要使用public修饰,对外暴露的方法也需要使用public修饰。

import Foundation
/// 播放器辅助类
/// 用于提供外部调用的播放与暂停接口。
public class PlayerHelper {/// 初始化方法public init() {}// MARK: - 对外暴露的接口/// 开始播放/// 调用该方法后会触发内部加载逻辑(示意)public func play() {print(" Start playing...")loadMediaFile()}/// 暂停播放/// 暂停当前的播放任务public func pause() {print("⏸ Pause playback.")}// MARK: - 私有逻辑(不会对外暴露)/// 加载媒体文件,仅供内部调用/// 外部工程无法访问此方法private func loadMediaFile() {print(" Load media from local file system.")}
}

2.3 设置配置信息

接下来我们还需要到“Build Setting”中查看一下配置信息,大多数情况下这些配置都是符合要求的,但是我们在这里还是来介绍一下,以便满足不同的需求。

设置 Defines Module

Build Settings → Packaging → Defines Module
将其设置为YES。

  • 表示当前 Framework 会作为一个独立的 Swift Module 存在。
  • 外部项目才能通过 import PlayerFramework 导入你的框架。
  • 如果关闭,则 Swift 编译器无法识别模块名。

 设置 Build Libraries for Distribution

Build Settings → Build Options → Build Libraries for Distribution
将其值设置为:YES。

  • 启用 Module Stability(模块稳定性),可避免因 Swift 版本不同而无法加载。
  • 生成 .swiftinterface 文件,用于暴露框架 API 接口签名(不会泄露实现代码)。
  • 这是 Swift 框架“被安全调用”的关键一步。

确认 Mach-O Type

Build Settings → Linking → Mach-O Type

选择动态库还是静态库。这个根据自己需要来选择,希望简单点的话直接选择静态库“ Static Library”。

  • 表示生成的 Framework 是一个可动态加载的库。
  • 这也是我们常说的 “动态 Framework”,可以被多个 App 引用而不重复加载。
  • 若选择 Static Library,则会在编译时被打包进 App,这种方式适用于 SDK,不适合模块化分发。

2.4 编译生成Framework

配置信息都检查完成之后,我们直接运行项目或者“command+B” 编译项目,关于生成的是真机使用的还是模拟器:

在Xcode的左上角选择目标设备,可以选择“Any iOS Device (arm64)”来编译适用于真机的版本,或者“Any iOS Simulator Device(arm64,x86_64)”。

也可以参考下面的文章进行合并:

https://blog.csdn.net/weixin_39339407/article/details/142988880?fromshare=blogdetail&sharetype=blogdetail&sharerId=142988880&sharerefer=PC&sharesource=weixin_39339407&sharefrom=from_link

编译成功之后之后,在菜单栏选择“Project” -> “Show build Folder in Finder”

就可以看见我们已经生成的Framework:

我们编译和运行的都是debug包,不能在生产环境使用嗷。
生成release环境的Framework可以选择“Archive”,如果有不太明白的可以私信或者留言。

三. Swift生成的Framework内容解析

当我们构建完成后(无论是运行在真机还是模拟器),在 Products 文件夹中会生成一个成品:

3.1 Headers 文件夹

PlayerFramework.framework/Headers/PlayerFramework.h

这个文件就是我们在工程里看到的 Umbrella Header

在 Objective-C 框架中,这个文件非常重要,

因为只有被列入公共头文件(Public Headers)的符号,才能被外部访问。

但在 Swift 框架中情况完全不同: Swift 框架不会依赖 .h 文件

  • 所有对外可见的符号由 public / open 修饰符控制;
  • 即使删除 .h 文件,Swift 框架依然可以被正常导入;
  • .h 文件的存在主要是为了 兼容 Objective-C 调用 Swift 框架 的情况。

所以,如果你纯 Swift 开发,这个文件几乎没用,只是个“占位符”。

3.2 Info.plist

这是 Framework 的元信息文件,包含:

  • 框架的版本号
  • 编译环境信息
  • Bundle Identifier 等

你基本不需要手动修改它。

3.3 Modules 文件夹

这个文件夹是 Swift 框架能被识别为 模块(Module) 的关键。

module.modulemap

这个文件告诉编译器:“这个 Framework 是一个模块,模块名叫 PlayerFramework。”

内容通常如下:

framework module PlayerFramework {umbrella header "PlayerFramework.h"export *module * { export * }
}

这段配置表示:

  • 框架的对外入口是 PlayerFramework.h
  • 模块名为 PlayerFramework
  • 允许 Swift 和 Objective-C 互操作(export *)

即使你没有手动设置,Xcode 会自动生成。

PlayerFramework.swiftmodule

这个文件夹里放的是 Swift 模块描述文件,它包含几种文件类型:

文件

作用

.swiftmodule

Swift 编译器读取的模块定义(二进制格式)

.swiftdoc

Swift 文档元数据(方法签名、注释等)

.swiftinterface

当你启用 “Build Libraries for Distribution = YES” 后生成的 文本描述文件,用于模块稳定性

3.4 PlayerFramework (二进制文件)

这是整个框架的核心部分。它是编译后的 Mach-O 动态库(.dylib 格式),包含你所有 Swift 源码的编译产物。

四. 使用Framework

接下来我们新建一个普通的Swift项目就叫“TestFrameworkDemo”,然后呢将我们刚刚生成的PlayerFramework 导入到项目中。

在ViewController可以直接引用该Framework,然后按住“command”使用鼠标点击“PlayerFramework”进入内部会发现,只有我们设置为public的方法可以被看见,并且只有方法方法名,并不会暴露方法内部的实现:

里面所有使用public修饰的方法,在外面都可以直接被调用。

五. Swift 与 Objective-C 的区别

其实OC与Swift构建Framework会有区别的根本原因在于Swift 与 Objective-C 在框架暴露机制上的本质区别

5.1 Objective-C:通过「头文件」决定暴露范围

在 Objective-C 的世界里,所有的符号暴露都是通过 头文件(.h) 来完成的。

如果你希望外部项目能访问某个类或方法,必须:

  • 把对应的 .h 文件添加到
  • Build Phases → Headers → Public 下;
  • 在 Umbrella Header(例如 PlayerFramework.h)中 #import 进来。
// PlayerManager.h
@interface PlayerManager : NSObject
- (void)play;
@end

若没有将 PlayerManager.h 添加为 Public,

即使你在别的文件中 import 了,也无法被外部工程识别。

所以,在 OC 框架中,“文件是否被暴露”完全取决于你有没有公开头文件。

5.2 Swift:通过「访问控制修饰符」决定暴露范围

Swift 的设计理念是模块化和安全性优先,

因此框架的暴露范围不再依赖外部文件配置,而是完全由 访问控制修饰符 决定:

修饰符

可见范围

说明

private

当前文件内

完全隐藏

fileprivate

当前源文件

类似私有

internal(默认)

当前模块

默认,仅框架内部可见

public

可被其他模块访问

框架对外公开的 API

open

可被访问且可被继承/重写

用于需要被扩展的 API

无需再去设置 “Public Headers”,Swift 编译器会根据修饰符自动生成 .swiftinterface 接口文件,供外部模块识别和调用。

5.3 模块层面的区别

对比项

Objective-C

Swift

暴露机制

头文件(Public Headers)

访问修饰符(public/open)

入口文件

Umbrella Header (.h)

自动生成 modulemap

接口文件

.h 文件

.swiftinterface 文件

源码泄露风险

可能(若暴露实现文件)

无(只生成签名信息)

模块导入方式

#import <Framework/Header.h>

import FrameworkName

六.结语

通过本篇教程,我们完整演示了 Swift 项目生成 Framework 的流程,并重点解析了其与 Objective-C 的区别:

  • Swift 不依赖 Public Headers 来控制暴露范围,而是通过 访问修饰符 决定哪些方法可被外部访问;
  • 编译生成的 .framework 中只包含 二进制和接口签名,源码不会暴露;
  • 对外暴露的 public 方法只是签名,对实现逻辑是不可见的,这让框架更加安全和可维护。

掌握这些原理后,你就可以自信地构建 Swift 框架,安全、规范地对外提供接口,同时保留内部实现的私密性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/981870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年十大广东机械设备源头厂家排行榜,新测评精选源头制造

为帮制造企业高效锁定适配自身需求的机械设备合作伙伴,避免选型走弯路,我们从技术自主化能力(如核心算法、精密控制技术)、产品性能指标(含精度、效率、适配性)、全周期服务质量(覆盖定制研发到售后运维)及真实…

我可以加入少女粤队吗?

NOIP 游记 2025.10.31 明天要考 CSP-S 了。标题来源。 NGOI 晋级 NOI 属于 B 类名额,广义上来讲算省队吧。 我一直在划水,而不是在写题。既然如此,不如把 NOIP 游记开了,再划多一些水吧。 update 2025.11.02 这里似…

2025年GEO推广优化企业排名:专业GEO推广优化公司推荐

在人工智能大模型流量爆发的时代,企业的营销战场正从传统搜索引擎转向AI大模型平台。如何抓住这波流量迁徙红利,成为众多企业的核心需求。下面为您推荐2025年专业、信誉好的GEO推广优化企业,帮助您在AI营销浪潮中抢…

2025年发表刊物哪家好?五大靠谱发表服务公司推荐,中赢文化

在学术成果转化与职称评定的关键节点,选择一家靠谱的刊物发表服务公司,直接关系到论文能否顺利见刊、评职是否成功。市场上服务质量参差不齐,假刊套刊、跑路风险频发,让众多学者和职场人陷入选择困境。以下结合用户…

基于MATLAB的二自由度机械臂PD控制

一、二自由度机械臂动力学建模 1. 物理参数定义 % 机械臂参数(单位:kg, m) m1 = 1; % 连杆1质量 m2 = 1; % 连杆2质量 l1 = 1; % 连杆1长度 l2 = 1; % 连杆2长度 lc1 = 0.5; % 连杆1质心到关节1距离 lc…

2025年中国电动汽车充电桩生产厂排名:电动汽车充电桩生产厂

TOP1 推荐:河南便易充网络科技有限公司 推荐指数:★★★★★ 口碑评分:国内首推的充电桩生产厂 专业能力:河南便易充网络科技有限公司是一家专注于新能源充电领域的创新型企业,依托强大的技术实力,积极投身于技术…

毕业生找工作TOP5权威推荐:精准破局求职困境,助力毕业生高

毕业季来临,就业难求职迷茫成为毕业生群体的高频痛点。数据显示,2025年全国高校毕业生规模预计突破1200万,传统求职渠道因信息不对称、匹配精准度低等问题,导致毕业生平均投递25份简历才获得1次面试机会,30%的应届…

线上遇到的redis和数据库数据未同步问题、redisson内部实现问题

背景 从离职同事手里接了一堆系统,其中一个系统,是对app提供服务的,虽说名义上这是一个系统,实际上,里面包含了五六个微服务,这其中有一个微服务,主要负责用户设备的上报和安全提醒,我们就叫设备管理服务: 1、…

2025年十大知名的媒体邀约品牌企业推荐,比较好的媒体邀约公

在信息爆炸的数字化时代,企业活动的声量传播不再局限于线下场景——一次成功的新品发布、一场高规格的行业峰会,其影响力往往取决于能否通过权威媒体矩阵实现精准触达。然而,市场上媒体邀约服务商鱼龙混杂:有的承诺…

2025苯板造型供应商TOP5权威推荐:甄选定制厂家,助力保

建筑保温与装饰一体化需求的激增,推动苯板造型市场规模年增速突破35%,但行业内28%的投诉集中在造型精度不足、交付延迟、材质与设计不符三大痛点——某商业综合体因苯板浮雕拼接缝隙超2mm返工,某婚礼堂因泡沫雕塑变…

详细介绍:在 SAP 中获取未清采购订单(PO)数量的方式有多种,以下是 6 种常用方法,涵盖标准事务码、报表、数据库表查询及自定义开发等场景

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

nestjs集成grpc服务 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

0,1序列

import torch import torch.nn as nn import random ------------------------- 超参数 ------------------------- N_max = 10 # 最大 n 值(训练时用) input_size = 4 # 字符集大小:0, 1, , hidden…

提升开发效率的关键:Python 在工程应用中的五大实战技巧

在越来越多的工程项目中,Python 已经从辅助脚本工具,变成不少团队的“主力语言”。不仅是数据分析和自动化脚本,在测试开发、运维监控、设备联网、系统接口等场景里,Python 几乎都能找到自己的位置。 项目做得越多…

2025文艺演出资深机构TOP5权威推荐:甄选专业团队助力活

企业年会、品牌发布会、行业峰会等场景中,高质量文艺演出是提升活动质感、强化品牌记忆的核心载体。2024年活动策划市场数据显示,文艺演出服务需求年增速达38%,但超28%的客户投诉集中在节目同质化、现场效果失控、资…

2025年东北玻璃钢雕塑品牌商推荐:十大玻璃钢雕塑制造厂批量

在建筑装饰、商业美陈、文化景观等领域,玻璃钢雕塑凭借轻质高强、造型灵活、耐候性强的优势,成为空间美学与功能需求的重要载体。随着市场对定制化、批量化玻璃钢雕塑需求的激增,如何选择兼具设计实力、生产能力与交…

2025年十大专业的活动策划专业公司推荐,实力强的活动策划公

在企业品牌传播、用户链接的关键场景中,一场优质的活动是企业传递价值、撬动增长的核心载体。面对市场上良莠不齐的服务提供商,如何找到真正专业的活动策划专业公司?以下结合行业属性与服务能力,为你推荐2025年十大…

2025年黑龙江苯板雕刻制造商推荐:苯板雕刻优质供应商和生产

本榜单依托东北地区保温材料及造型定制领域的市场调研与真实客户反馈,深度筛选出五家标杆企业,为建筑装饰、商业美陈、婚庆会展等领域客户选型提供客观依据,助力精准匹配适配的服务伙伴。 TOP1 推荐:哈尔滨万嘉保温…

快懂百科创建代做公司有哪些,推荐一家能做快懂百科的公司

在AI搜索日益普及的当下,快懂百科作为重要的知识展示平台,成为企业建立线上权威形象、提升品牌认知度的关键载体。一份规范、完善的快懂百科词条,不仅能为消费者提供准确的品牌信息,更能凭借平台的公信力增强用户信…

2025年哈尔滨苯板立体雕刻加工厂/制造厂哪家更值得选?

为帮助建筑装饰、婚礼堂布置、影视道具制作等领域的客户精准锁定适配需求的苯板雕刻合作伙伴,避免因工艺粗糙、交付延迟导致项目损失,我们从雕刻精度(毫米级误差控制)、定制化能力(复杂造型还原度)、材料适配性(…