iOS静态库(.a)及资源文件的生成与使用详解(Swift版本)

news2024/10/22 16:42:06

引言

在 iOS 开发中,开发者常常需要将一些功能模块封装成可重用的库,以便在多个项目中共享使用。除了常见的Framework(动态库/静态库),静态库(.a文件)也是一种非常实用的封装方式。静态库在编译时会被直接链接到最终的可执行文件中,具有更高的运行时性能和更小的内存开销。

然而,与Framework不同的是,静态库本身不支持直接打包资源文件。这使得在生成.a文件的同时,如何处理相关的资源文件,成为了一个开发者需要面对的挑战。本文将详细介绍如何生成.a文件,并阐述将资源文件与静态库配合使用的方法,帮助你在项目中更好地管理和集成静态库及其资源。

生成 .a 文件的步骤

我们就以创建一个自定义的带图片的Toast功能为例,将此功能打包到一个.a文件中。

其中包含4个文件:

  • caomei@2x:图片资源文件。
  • PHToastView:Toast视图。
  • PHToastHelper:Toast管理类。
  • PHToastHelper+internal:PHToastHelper的扩展,里面是方法的具体实现。

具体代码如下:

PHToastView

import UIKit

class PHToastView: UIView {

    /// 图片
    private let imageView = UIImageView()
    /// 文字
    private let titleLabel = UILabel()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        addImageView()
        addTitleLabel()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    /// 添加图片
    private func addImageView() {
        imageView.image = UIImage(named: "caomei")
        imageView.contentMode = .scaleAspectFit
        imageView.frame = CGRect(x: 8.0, y: 0, width: 16.0, height: 16.0)
        self.addSubview(imageView)
    }
    
    /// 标题
    private func addTitleLabel() {
        titleLabel.text = "这是一个toast"
        titleLabel.textColor = .black
        titleLabel.font = UIFont.systemFont(ofSize: 12.0)
        titleLabel.frame = CGRect(x: 28.0, y: 2.0, width: 100.0, height: 16.0)
        addSubview(titleLabel)
    }
    
    /// 设置文本
    func setText(_ text: String) {
        titleLabel.text = text
        titleLabel.sizeToFit()
        titleLabel.frame = CGRect(x: 28.0, y: 2.0, width: titleLabel.bounds.size.width, height: 16.0)
        self.frame = CGRect(x: 0, y: 0, width: titleLabel.bounds.size.width + 36.0, height: 20.0)
    }

}

PHToastHelper

import UIKit

public class PHToastHelper: NSObject {

    /// 显示toast
    /// - Parameters:
    ///  - text: 文字
    ///  - view: 父视图
    ///  - duration: 显示时间
    public static func showToast(text: String, view: UIView, duration: TimeInterval = 2.0) {
       internal_showToast(text: text, view: view, duration: duration)
    }

}

PHToastHelper+internal

extension PHToastHelper {
    private static let toastView = PHToastView()
    static var showing = false

    /// 显示toast
    /// - Parameters:
    ///  - text: 文字
    ///  - view: 父视图
    ///  - duration: 显示时间
    internal static func internal_showToast(text: String, view: UIView, duration: TimeInterval = 2.0) {
        if showing {
            return
        }
        showing = true
        toastView.setText(text)
        toastView.backgroundColor = .black.withAlphaComponent(0.02)
        toastView.layer.masksToBounds = true
        toastView.layer.cornerRadius = 3.0
        let x = (view.bounds.size.width - toastView.bounds.size.width) * 0.5
        let y = (view.bounds.size.height - toastView.bounds.size.height) * 0.5
        toastView.frame = CGRect(x: x, y: y, width: toastView.bounds.size.width, height: toastView.bounds.size.height)
        view.addSubview(toastView)
        DispatchQueue.main.asyncAfter(deadline: .now() + duration) {
            toastView.removeFromSuperview()
            showing = false
        }
    }
}

接下来我们就开始以这些文件为基础来创建一个.a以及资源文件包。

1. 配置Xcode项目生成静态库

  1. 创建一个新的Xcode项目:选择 “iOS” -> “Framework & Library” -> “Static Library”模板。
  2. 设置目标(Target)配置:在项目的Build Settings中,确认 “Build Active Architecture Only” 选项为NO,以确保支持所有的架构。
  3. 添加源文件:将需要包含在静态库中的源代码文件添加到项目中。

2. 编译和构建 .a 文件

  1. 选择正确的Scheme和架构:确保选择目标设备的Scheme,比如模拟或真机,并配置支持的架构(如arm64和x86_64)。
  2. 执行构建:直接运行,或者编译项目来生成静态库。编译完成后和Framework一样,在项目的“Build Products”目录下会生成 .a 文件 (Product -> Show Build Folder in Finder)。 
  3. 打开目录找到.a文件以及.swiftmodule文件。

3. 确保兼容不同架构

如果你的项目本来就只支持真机编译,那么只需要生成支持arm64架构的.a文件即可,但是如果说你的项目既要求可以在真机上运行又可以在模拟器上运行,那么需要使用lipo命令来将针对不同架构生成的.a文件合并为一个通用的文件。

lipo -create Release-iphoneos/libYourLibrary.a Release-iphonesimulator/libYourLibrary.a -output libYourLibrary.a

开始使用 .a 文件步骤

1. 将 .a 文件和 .swiftmodule文件添加到其它项目。

  1. 将生成的 .a 文件和.swiftmodule文件拖拽到其它项目。
  2. 确保在 “Build Phase” -> “Link Binary With Libraries”下可以看见.a文件。
  3. 在“Build Settings” -> “Swift Compiler - Search Paths” -> "Import Paths" 下,引入PHToast.swiftmodule文件的路径。

2. 引入module调用.a文件中的对外开放的方法

由于 Swift 的模块化特性,导入时可以直接使用模块名称。

import UIKit
import PHToast

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let button = UIButton(type: .system)
        button.setTitle("Show Toast", for: .normal)
        button.backgroundColor = .blue
        button.addTarget(self, action: #selector(showToast), for: .touchUpInside)
        button.frame = CGRect(x: 100, y: 100, width: 200, height: 50)
        self.view.addSubview(button)
    }

    @objc func showToast() {
        PHToastHelper.showToast(text: "Hello, Toast!", view: self.view)
    }

}

效果如下:

加载关联资源

在生成.a 文件并成功集成到项目后,我们经常会遇到这样一个场景的问题:库中的图片资源或者其它资源文件没有正常显示。这是因为.a静态库和Framework的资源加载机制不同。静态库本身无法直接打包和管理资源文件,需要我们手动配置和加载这些资源。接下来我们将详细介绍如何在项目中正确加载和使用.a文件关联的资源文件。

其实有很多方法可以解决这个问题,但是保证资源文件和.a静态库文件可以一起分发和使用,通常我们会采用.bundle文件来组织资源。

1. 创建.bundle 文件

  1. 新建一个 Bundle target:在Xcode中,选择 “File” -> “New” -> “Target”,然后选择“macOS”(即使是iOS项目,.bundle文件也使用),在选择“Bundle”选项,输入资源包名称。
  2. 将资源文件添加到Bundle target:把需要的资源(图片、音频、配置文件等)拖入到Xcode中,然后在“Target Membership”中选择刚创建的.bundle文件。

2. 编译并打包 .bundle文件

  1. 确保在新创建的Bundle target中的Build Settings中的“Skip Install”选项设置为YES,防止它被打入最终的App。
  2. 运行新建的Bundle Target,成功之后文件将会生成在项目“Products”目录下。

3. 将.bundle文件和.a文件一起分发

  1. 重新修改代码中对资源加载的代码,并打包生成新的.a文件。
  2. 将.bundle文件和.a文件同时添加到项目,并确保.bundle文件被添加到主项目,确保它包含在最终的应用包中。
  3. 确保在“Build Phases”下可以看见.a和.bundle文件。
/// 添加图片
    private func addImageView() {
        if let bundle =  Bundle.main.path(forResource: "PHToast", ofType: "bundle").flatMap { Bundle(path: $0) } {
            imageView.image = UIImage(named: "caomei", in: bundle, compatibleWith: nil)
        }
        imageView.contentMode = .scaleAspectFit
        imageView.frame = CGRect(x: 8.0, y: 0, width: 16.0, height: 16.0)
        self.addSubview(imageView)
    }

再次运行项目,结果如下:

结语

通过本篇博客的介绍,我们详细了解了如何生成 .a 文件,以及在 iOS 开发中正确加载静态库的资源文件。使用 .bundle 文件来组织资源不仅可以使项目结构更加清晰,还能简化资源管理过程。无论是图片、音频,还是其他资源文件,只要遵循这些步骤,都可以确保在使用静态库时资源正常加载。

静态库是 iOS 开发中常用的封装方式之一,而不同语言的实现方式会有所不同。在Objective-C中它的实现和引用与Swift都有所区别,下一篇博客我们再来详细介绍一下关于Objective-C中生成以及使用.a文件的流程。

在实际开发和使用过程中,如果遇到问题也可以通过私信或者是留言的方式联系我。

 

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

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

相关文章

Java全栈经典面试题剖析4】JavaSE高级 -- 包装类,String, 类方法

目录 面试题3.1 什么是自动装箱与拆箱?用什么方式来装箱与拆箱? 面试题3.2 int和Integer有什么区别? 面试题3.3 Integer常量池 面试题3.4 字符串常量池 面试题3.5 这句代码创建了几个对象? String str1 new String("xyz");…

前端拦截302重定向

背景: 根据业务场景需要拦截302做后续的逻辑处理 尝试一: : axios拦截 、、、、、async created() {// 获取302请求返回的location后手动修改video的src路径let targetSrc;try {await axios.get(this.video).then((res) > {const { headers, status } res;const { locat…

Android 图片相识度比较(pHash)

概述 在 Android 中,要比对两张 Bitmap 图片的相似度,常见的方法有基于像素差异、直方图比较、或者使用一些更高级的算法如 SSIM(结构相似性)和感知哈希(pHash)。 1. 基于像素的差异比较 可以逐像素比较…

学习笔记——Test.pwn

前言:笔者也才接触Pwn,写这篇wp,记录目前所得感悟、思考、理解等。 存在错误,或者解释不通的地方,还请提出,已补足笔记的缺陷。 Pwn是什么? 我Pwn掉了你的电脑、我Pwn掉了你的设备…… 通俗的…

重庆大学软件工程考研,难度如何?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 重大软件专业可谓是最好上岸的985院校!重庆大学24考研各大学院复试录取情况已出, 我们先说学硕部分: 招生人数: 重庆大学软件工程学硕近几年计划统招人数都不多&#xf…

入选ECCV 2024!浙江大学联合微软亚洲研究院提出统一医学图像预训练框架UniMedI,打破医学数据异构化藩篱

让 AI 在某些条件下具备类似人类的反应能力,从而代替人类高效地从事特定工作,是 AI 领域研究人员孜孜不倦的追求。正如在医学图像和人工智能的交叉领域,基于视觉语言预训练的深度模型 (Visual-Language Pre-training, VLP) 凭借其自动化的特点…

Docker本地镜像发布到阿里云镜像服务的简易指南

1 阿里云容器镜像服务 阿里云容器镜像服务(Alibaba Cloud Container Registry,简称ACR)是一个为容器镜像、Helm Chart等云原生资产提供安全托管及高效分发的平台。它支持多架构容器镜像,包括Linux、Windows、ARM等,以…

心觉:感恩日记:每天5分钟,重新定义你的人生

​Hi,我是心觉,与你一起玩转潜意识、脑波音乐和吸引力法则,轻松掌控自己的人生! 挑战每日一省写作207/1000天 你是否觉得生活节奏太快,总是有做不完的事、解决不完的问题? 有一个简单的方法,…

DEPT_ DECOMPOSED PROMPT TUNING FOR PARAMETER-EFFICIENT FINE-TUNING

论文汇总 当前的问题 (1)Prompt Tuning通常收敛缓慢,并且对初始化敏感; (2)Prompt Tuning延长了输入序列的总长度,从而加剧了计算需求(即训练/推理时间和内存成本),这是由于Transformer的二次复杂度(Vaswani et al, 2017)。 解…

机器视觉系统硬件组成之工业相机篇

工业相机是一种非常重要的机器视觉器件,它能够将被采集的图像信息通过电路转换成电信号,再通过模数转换器(ADC)将其转化为数字信号,最后以标准的视频信号输出。工业相机在机器视觉领域得到了广泛应用,包括质…

springboot055服装生产管理的设计与实现(论文+源码)_kaic

毕业设计(论文) 协力服装厂服装生产管理系统 的设计与实现 学生姓名 XXX 学 号 XXXXXXXX 分院名称 XXXXXXXX 专业班级 XXXXX 指导教师 XXXX 填写…

CROss PlatformS (CROPS) 与 Docker

CROPS 是一个开源的、跨平台的开发框架,专为利用 Docker 容器在 Windows、macOS 和 Linux 系统上创建和管理构建主机而设计。它简化了在非 Linux 系统上运行 Yocto 项目及其他基于 Linux 的工具的过程,同时提供了一个可扩展的开发环境,支持多…

基于vue框架的的地铁站智慧管理系统的设计n09jb(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,上班打卡,下班打卡,人员管理,交接班,视频巡检,车辆巡检,车辆管理 开题报告内容 基于Vue框架的地铁站智慧管理系统的设计开题报告 一、研究背景与意义 随着城市化进程的加速,地铁站作为城市交通系统的重要组成部分&am…

全能型选手视频播放器VLC 3.0.21 for Windows 64 bits支持Windows、Mac OS等供大家学习参考

全能型选手视频播放器,支持Windows、Mac OS、Linux、Android、iOS等系统,也支持播放几乎所有主流视频格式。 推荐指数: ★★★★★ 优点: ◆、界面干净简洁,播放流畅 ◆、支持打开绝大多数的文件格式,包…

用Aconvert.com将MOBI文件转换为PDF:一步步指南

在今天的数字时代,文件格式转换是日常办公和学习中常见的需求之一。MOBI格式的电子书文件在某些设备上不太方便阅读,而PDF格式则更加通用。本文将为你详细介绍如何使用Aconvert.com将MOBI文件转换为PDF文件。 1. 访问Aconvert.com 首先,打开…

装修公司行业通用的小程序源码系统 让装修公司实现信息智能化 带完整的安装代码包以及搭建部署教程

系统概述 装修公司行业通用的小程序源码系统是一款专门为装修公司设计的智能化解决方案。它基于先进的技术架构,结合装修行业的特点和需求,为装修公司提供了全方位的业务支持和管理功能。 该系统通过小程序的形式呈现给用户,方便客户随时随…

MacOS13虚拟机VMware Workstation Pro 16安装

资源 安装unlocker 安装虚拟机 低版本的还没有MacOS13选项,这也是我安装低版本虚拟机踩过的坑 找个教程安装就可以了 省略…自己去找找教程… 过程中我使用桥接是不行的,没有网络,后面重新下一步一步的选择默认的网络重装后就好了&am…

基于yolov10的驾驶员抽烟打电话安全带检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv10的驾驶员抽烟、打电话、安全带检测系统是一种先进的驾驶行为监测系统。该系统利用YOLOv10算法的高效性和准确性,实现对驾驶员行为的实时检测与识别。 YOLOv10是一种最新的实时物体检测模型,其通过深度学习技术,如卷…

如何看ip属于什么地址

在数字化时代,IP地址作为互联网通信的基石,扮演着至关重要的角色。无论是网络管理、安全防护,还是日常的网络访问,理解IP地址的性质和分类都是必不可少的技能。本文将深入探讨如何判断一个IP地址属于哪一类地址,并详细…

Java项目-基于springboot框架的校园医疗保险管理系统项目实战(附源码+文档)

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…