实现iOS Framework生成全流程详解

news2024/11/28 4:52:15

引言

在iOS开发中,Framework是实现代码复用和模块化开发的有效手段。它不仅可以将复杂的功能封装为独立的组件,还能提升代码的可维护性和可扩展性。Framework的广泛应用使得我们可以轻松地集成第三方库,或将自己的功能打包分发给团队成员使用。尤其是大型项目中,使用Framework来管理不同的功能模块,更能大大简化项目的结构和维护工作。

本篇博客将以Swift为例,介绍如何生成iOS Framework,从创建项目到打包的完整流程。同时我们还将探讨如何支持多架构(如真机和模拟器),后序可能还会涉及如何通过Swift Package Manager或CocoaPods等工具分发Framework,帮助开发者更高效地实现代码管理和分发。

iOS Framework基础知识

Framework的定义和作用

  • Framework是一个封装好的可复用模块,包含了动态或静态库、头文件、资源文件(如图片、xib文件等)。在iOS开发中,Framework用于将代码、资源和接口封装起来,以便于在不同的项目之间共享和分发。
  • 使用Framework有助于模块化开发,可以将独立的功能单独打包,减少项目之间的耦合度,并提高代码复用性。

静态Framework和动态Framework

在构建Framework时我们可以选择是动态库(Dynamic Library)还是静态库(Static Library)。

  • 静态Framework:在编译时直接链接到目标应用中,最终生成的应用二进制会包含Framework的内容。优点是加载速度快,但会增加应用的体积。
  • 动态Framework:在运行时才被加载到内存中,多个应用可以共享同一个动态Framework的实例。可以减小应用体积,但加载时可能会有性能开销。

Framework的目录结构

iOS Framework通常包含以下几个目录和文件:

  • Headers:存储公共头文件(公开的API接口)。
  • Modules:存放模块文件(如module.modulemap),用于支持模块化导入(@import)
  • Resources:包含资源文件(如图片、xib文件),动态Framework可以加载这些资源。
  • Info.plist:包含Framework的基本配置信息,如版本号、标识符等。

XCFramwork

XCFramwork是苹果在Xcode 11引入的新型Framework格式,可以同时包含多个平台的二进制文件(如iOS设备和模拟器)。这使得XCFramework在支持多架构上更为方便,是目前苹果推荐的做法。

相比于传统的.framework,XCFramework能够更好地解决跨结构兼容性问题。

生成iOS Framework的详细步骤

1. 创建Framework项目

  1. 打开Xcode在菜单栏点击“File” -> “New” -> “Project...”。
  2. 选择Framework & Library下的 “Framework”点击next。
  3. 输入Framework的名称及语言点击next。
  4. 配置项目的目标平台版本(如iOS 18.0),确保与应用的最低版本支持版本一致。
  5. Xcode会生成一个包含Framework基本结构的项目,其中包含了一个默认的.h文件(通常是<FrameworkName>.h)

2. 编写代码和资源

  1. 在Framework中添加需要的代码和资源文件。
  2. 如果需要对外提供API接口,需要再public访问级别的类或方法前添加public关键字。
  3. 将对外暴漏的头文件(如Objective-C中的头文件)防止到“Public”区域,以便在外部项目中可以访问。
  4. 资源文件(如图片、xib文件)可以添加到Framework的资源目录中,并在编写代码时通过Bundle加载。

在本示例中,我们创建了三个文件PHLiveRoomProtocol、PHLiveRoomManager以及PHLiveRoomManager+internal。

其中PHLiveRoomProtocol.Swift主要定义了公共的接口,代码如下:

import UIKit

public protocol PHLiveRoomProtocol {
    
    /// 开始直播
    func startLive()
    /// 结束直播
    func endLive()
    /// 连麦
    func connectMic()
    /// 踢人
    func kickUser(uid:Int)
    
}

PHLiveRoomManager.Swift是接口的实现,代码如下:

public class PHLiveRoomManager: PHLiveRoomProtocol {
    
    public init() {}
    
    /// 开始直播
    public func startLive() {
        internal_startLive()
    }
    
    /// 结束直播
    public func endLive() {
        internal_endLive()
    }
    /// 连麦
    public func connectMic() {
        internal_connectMic()
        
    }
    /// 踢人
    public func kickUser(uid: Int) {
        internal_kickUser(uid: uid)
    }

}

PHLiveRoomManager+internal.Swift是PHLiveRoomManager的扩展,里面是方法的具体实现内容,代码如下:

import UIKit

extension PHLiveRoomManager {
    
    /// 开始直播
    internal func internal_startLive() {
        print("startLive")
    }
    
    /// 结束直播
    internal func internal_endLive() {
        print("endLive")
    }
    
    /// 连麦
    internal func internal_connectMic() {
        print("connectMic")
    }
    
    /// 踢人
    internal func internal_kickUser(uid: Int) {
        print("kickUser: \(uid)")
    }
    
}

和Objective-C不同,Swift设置public暴漏文件时,会把整个文件暴漏出去,而在Objective-C我们只需要暴漏.h文件,方法的具体实现在.m中就被很好的隐藏了起来。要想在Swift中隐藏方法实现的细节我们就不得采用扩展或者使用引用其它类来实现。

3. 配置构建信息(Build Setting和Build Phases)

  1. 设置 Defines Module,确保其设置为 Yes。这允许Xcode为你的Framework创建模块接口。
  2. 设置 Build Libraries for Distribution为 Yes。这会确保生产 .swiftinterface文件,允许其他Swift项目使用你的Framework时查看公共接口,而隐藏实现细节。
  3. 设置Build Active Architecture Only,通常在Debug配置下设置为Yes,在Release配置下设置为No。
  4. 设置Architectures:确保包含arm64和x86_64,以支持设备和模拟器。
  5. 设置Match-O Type为动态库或者静态库,首次尝试的伙伴可以先选择静态库(Static Library)。
  6. 设置需要暴漏的文件(Build Phases)。

4. 打包Framework

  1. 在Xcode的左上角选择目标设备,可以选择“Any iOS Device (arm64)”来编译适用于真机的版本,或者“Any iOS Simulator Device(arm64,x86_64)”。
  2. 运行或编译项目,编译完成后点击菜单栏的“Product” -> "Show Build Folder in Finder"。
  3. 在build目录找到Products文件里面会有对应模拟器或是真机对应的Framework。
  4. 每个Framework都可以单独使用,也可以使用lipo工具将多个架构的二进制文件合并成一个单一的Framework。

lipo -create <模拟器路径>/MyFramework.framework/MyFramework <真机路径>/MyFramework.framework/MyFramework -output <合并后的路径>/MyFramework.framework/MyFramework

5. 生成XCFramework(推荐)

从Xcode 12开始,推荐使用XCFramework来支持多架构。

使用命令行将已经生成好的真机和模拟器两个framework合并成XCFramework。

xcodebuild -create-xcframework -framework <真机路径>/MyFramework.framework -framework <模拟器路径>/MyFramework.framework -output <保存路径>/MyFramework.xcframework

使用Framework

接下来我们只需要将生成好的.framework或者是.xcframwork文件添加到一个新的项目中。

然后引入我们创建的Framework,就可以调用暴漏出来的方法了。

import PHLiveModuleManager

class PHMeViewController: PHBaseViewController, UIImagePickerControllerDelegate & UINavigationControllerDelegate {
    
   ....    
    
    /// 直播间
    private let liveRoomManager:PHLiveRoomProtocol = PHLiveRoomManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        initData()
        setupView()
        setLayout()
        setEvent()
        liveRoomManager.startLive()
    }
....

结果如下:

startLive

结语

在iOS开发中,生成Framework是一项必备的技能,不仅有助于实现代码复用,还能提升项目的模块化和可维护性。通过本篇博客的详细介绍,我们了解了如何使用Swift创建和打包Framework,以及如何支持多架构和进行分发。随着XCFramework的引入,苹果生态中的多架构支持变得更加便捷,也为未来的开发带来了更多可能。

希望通过这篇文章,能帮助开发者掌握Framework的生成流程,并将其应用到实际项目中。如果在操作过程中遇到问题或有进一步的需求,欢迎留言讨论,共同探索iOS开发的更多可能性。

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

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

相关文章

CF351E Jeff and Permutation 题解

#1024程序员节&#xff5c;征文# 人生中的第一道紫题。。。 ​​​​​​题目传送门 解题思路 首先我们可以得到读入时 的正负不影响答案&#xff0c;因为我们可以进行一次操作将它们变成它们的相反数&#xff0c;从而使其变成原数&#xff0c;因此&#xff0c;我们可以将…

项目篇--Maven+Idea+ PrimeFaces+Jsf--项目搭建

文章目录 前言一、PrimeFaces 和 Jsf&#xff1a;1.1 JSF 基础&#xff1a;1.2 PrimeFaces 扩展&#xff1a; 二、项目搭建&#xff1a;2.1 Maven 项目的创建&#xff1a;2 xml 配置&#xff1a;2.1 pom.xml 配置2.2web.xml 配置&#xff1a; 2.3 代码&#xff1a;2.3.1 页面&a…

(六)STM32F407 cubemx MPU6050通讯硬件寄存器配置部分(2)

这篇文章主要是个人的学习经验&#xff0c;想分享出来供大家提供思路&#xff0c;如果其中有不足之处请批评指正哈。废话不多说直接开始主题&#xff0c;本人是基于STM32F407VET6芯片&#xff0c;但是意在你看懂这篇文章后&#xff0c;不管是F1,F4,H7等一系列MPU6050通讯硬件寄…

Redis学习笔记(六)--Redis底层数据结构之集合的实现原理

文章目录 一、两种实现的选择二、ziplist1、head2、entries3、end 三、listPack1、head2、entries3、end 四、skipList1、skipList原理2、存在的问题3、算法优化 五、quickList1、检索操作2、插入操作3、删除操作 六、key与value中元素的数量 本文参考&#xff1a; Redis学习汇…

从天边的北斗到身边的北斗 —— 探索北斗导航系统的非凡之旅

引言&#xff1a;穿越时空的导航奇迹 在浩瀚的夜空之中&#xff0c;北斗七星以其独特的排列&#xff0c;自古以来便是指引方向的天文坐标。而今&#xff0c;这份古老的智慧与现代科技完美融合&#xff0c;化作了覆盖全球的卫星导航系统——中国北斗。从遥远的星河到触手可及的…

不考虑光影、背景、装饰,你的可视化大屏摆脱不了平淡。

如果在可视化大屏的设计中不考虑光影、背景和装饰&#xff0c;确实难以摆脱平淡。光影效果可以为大屏增添立体感和层次感&#xff0c;吸引观众的注意力。 合适的背景能营造出特定的氛围&#xff0c;使数据展示更具情境感。而装饰元素则可以起到点缀和美化的作用&#xff0c;提…

【无标题】unity, 在编辑界面中隐藏公开变量和现实私有变量

1.unity, 在编辑界面中隐藏公开变量 [HideInInspector]public int Num; 2.[SerializeField]反序列化显示私有变量 SerializeField是Unity引擎中的一个特性&#xff0c;用于使私有变量在Inspector中可见并可编辑 [SerializeField] private int time; 实例效果如下图示&…

Xshell删除键不好使:删除显示退格^H

1、问题&#xff1a; Xshell不能删除&#xff0c;删除时出现 退格^H 2、解决方案&#xff1a; 点击上方&#xff1a;文件→属性→终端→键盘&#xff0c;把 delete 和 backspace 序列改为 ASCII 127即可。如下所示&#xff1a; 3、重启Xshell&#xff0c;即可以删除了。

UE5 射线折射

这个判断是否有标签是需要带有此标签的Actor来反射

基础知识 main函数形参 C语言

main函数完整的函数头&#xff1a;int main(int argc,char *argv[]) 或 int main(int argc,char **argv)arg-----argument参数c -----count个数v -----value值、内容 假设命令行上运行一个程序的命令如下&#xff1a;./test abc def 123 则test这个程序的main函数第一个…

论当前的云计算

随着技术的不断进步和数字化转型的加速&#xff0c;云计算已经成为当今信息技术领域的重要支柱。本文将探讨当前云计算的发展现状、市场趋势、技术革新以及面临的挑战与机遇。 云计算的发展现状 云计算&#xff0c;作为一种通过网络提供可伸缩的、按需分配的计算资源服务模式&a…

【AIGC】优化长提示词Prompt:提升ChatGPT输出内容的准确性与实用性

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;长提示词的挑战&#x1f4af;谷歌的优化长提示词技术关键因素分析 &#x1f4af;长提示词的设计原则&#x1f4af;优化长提示词的新框架方法&#x1f4af;实验结果分析不…

PostgreSQL的前世今生

PostgreSQL的起源可以追溯到1977年的加州大学伯克利分校&#xff08;UC Berkeley&#xff09;的Ingres项目。该项目由著名的数据库科学家Michael Stonebraker领导&#xff0c;他是2015年图灵奖的获得者。以下是PostgreSQL起源的详细概述&#xff1a; 一、早期发展 Ingres项目…

【正点原子K210连载】第四十七章 MNIST实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第四十七章 MNIST实验 在上一章节中&#xff0c;介绍了利用maix.KPU模块实现了车牌的检测和识别&#xff0c;本章将继续介绍利用maix.KPU模块实现的MNIST识别。通过本章的学习&#xff0c;读者将学习到MNIST识别应用在CanMV上的实现。 本章分为如下几个小节&#xff1a; 47.1 …

058_基于python时尚女装抖音号评论数据分析系统

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…

国外白帽故事 | 攻破大学数据库系统,暴露数千学生记录

引言 在这篇文章中&#xff0c;我将分享我是如何攻破一个大型大学解决方案门户服务器的&#xff0c;这个服务器服务于许多大学客户&#xff0c;并且涉及数千名学生的数据。 目标 这是一个由印度许多大学和学院使用的门户网站&#xff0c;用于管理学生记录、成绩单、出勤记录…

【JavaEE】——四次挥手,TCP状态转换,滑动窗口,流量控制

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;断开连接的本质 二&#xff1a;四次挥手 1&#xff1a;FIN 2&#xff1a;过程梳理 …

MacOS RocketMQ安装

MacOS RocketMQ安装 文章目录 MacOS RocketMQ安装一、下载二、安装修改JVM参数启动关闭测试关闭测试测试收发消息运行自带的生产者测试类运行自带的消费者测试类参考博客&#xff1a;https://blog.csdn.net/zhiyikeji/article/details/140911649 一、下载 打开官网&#xff0c;…

华为云容器引擎(CCE):赋能企业云原生转型

在当今数字化时代&#xff0c;企业面临着日益复杂的应用部署和管理挑战。为了解决这些问题&#xff0c;容器技术应运而生&#xff0c;成为云原生架构的核心。华为云容器引擎&#xff08;CCE&#xff09;作为一款全面的容器管理解决方案&#xff0c;旨在帮助企业实现高效、灵活的…

Linux终端之旅: 打包和压缩

在 Linux 世界中&#xff0c;打包和压缩文件是管理系统资源、传输数据和备份的重要技能。通过命令行工具如 tar、gzip、zip 等&#xff0c;我们可以高效地将多个文件或目录打包为一个文件&#xff0c;并通过压缩减少其体积。接下来&#xff0c;我将记录学习如何利用这些工具&am…