iOS 制作私有库framework + 图片资源的使用

news2024/9/21 2:47:51

1. 库的分类

  1. 开源库:公开源代码,能看到具体实现
  2. ** 闭源库**:不公开源代码,是经过编译后的二进制文件,看不到具体实现;其中包括:静态库和动态库

2. 开源库的制作

我了解的开源库的制作,就是将代码上传到cocopods上,提供其他人下载使用。
优点:制作简单
缺点:暴露源码
cocopods上传的步骤:
将代码上传到cocopods

3. 静态私有库framework的制作

3.1 用xcode创建一个framework工程:

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
创建后的工程如下:
在这里插入图片描述

3.2 添加代码

将准备好的代码添加到工程里
在这里插入图片描述
添加对应的代码文件目录如下:
在这里插入图片描述
在这里插入图片描述

3.3 配置工程文件

设置兼容最低的iOS系统
在这里插入图片描述

设置Build Active Architecture Only 值 为NO。如下图(适配所有版本的模拟器和真机)
在这里插入图片描述

设置Mach-O Type值为Static Library(静态库)。如下图
在这里插入图片描述

设置Excluded Architectures下的 Any ios Simulator SDK 值为 arm64。(模拟器生成的.framework, 不需要arm64架构)。如下图 切记taget不要看错了。
在这里插入图片描述
在这里插入图片描述

3.4 设置暴露的头文件

将需要别人引用的头文件设置public。默认在project(不可见,私有)。
在这里插入图片描述

在自动生成的IGLiveSDK的.h 文件中,加入需要暴露的头文件, 格式应该是用"<>“
在这里插入图片描述
注意:设置public的文件,与在LGLiveSDK 设置的头文件要保持一致,不然编译不通过。

3.5 引用到其他的三方库时的操作

如果代码中引用到了其他的三方库,例如AFN, Masonry等等,那么也需要在framework的工程中集成过来,保证能编译成功。
用命令行进入项目文件下:
执行”pod init“
在这里插入图片描述

在Podfile 中,添加对应的其他三方库
在这里插入图片描述

回到命令行,执行“pod install”
在这里插入图片描述

3.6 设置编译模式 release

在这里插入图片描述

3.7 编译

先选择真机编译 ,command+b 生成真机.framework,如果不成功,看看是什么问题
在这里插入图片描述

选择模拟器,command+b 生成模拟器.framework
在这里插入图片描述

3.8 真机和模拟器都编译成功后,合并生成对应的framework

在project下的新建一个run script, 执行后自动生成合并后的framework
Project --> TARGETS --> Build Phases -> + --> New Run Script Phases 如下:
在这里插入图片描述
在新建的run script 下添加如下的代码:

# Type a script or drag a script file from your workspace to insert its path.
if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
# 如果真机包或模拟包不存在,则退出合并
if [ ! -d "${DEVICE_DIR}" ] || [ ! -d "${SIMULATOR_DIR}" ]
then
exit 0
fi

# 如果合并包已经存在,则替换
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# 使用lipo命令将其合并成一个通用framework  
# 最后将生成的通用framework放置在工程根目录下新建的Products目录下  
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
#合并完成后打开目录
open "${SRCROOT}/Products"
fi

添加后的效果如下:
在这里插入图片描述
真机模拟器 都各编译完一次后,才能执行这段代码,执行步骤,就是common + B, 编译完后,会在工程目录下生成对应的framework,如下图:
在这里插入图片描述

3.9 使用framework

将framework拖到需要使用的工程目录下,为了方便管理添加的framework库,我在工程目录下创建了一个“Library”文件夹,我添加的路径,如下图
在这里插入图片描述
打开工程,添加对应的framework
在这里插入图片描述
添加后的样子
在这里插入图片描述
在 target下的general 的Framework 、libraries 下 点击" + " 选择 “ Add file” 将 对应的Framework添加进来,并将值设置为“Do Not Embed”
在这里插入图片描述
在需要的地方添加引用逻辑即可。

4. Framework中需要用到资源的添加

回到制作Framework的工程中,在生成的framework 目录即 Product 下,与 framework平级下添加一个.bundle, 如下图
在这里插入图片描述
将图片资源放到进去,然后在使用Framework的工程中,也添加这个bundle文件,如下图:
在这里插入图片描述在这里插入图片描述

Framework中 图片的获取,注意需要区分@2x.png 和 @3x.png , 图片的名称必须写全,否则会找不到图片的。

- (UIImage *)getImageWithName:(NSString *)imageName {
    NSBundle *bundle = [NSBundle bundleForClass:[self class]];
    //IGLiveSDK 需要修改成创建的对应的bundle名
    UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"IGLiveSDK.bundle/%@@2x.png",imageName] inBundle:bundle compatibleWithTraitCollection:nil];
    if (image == nil) {
        image = [UIImage imageNamed:imageName];
    }
    return image;
}

—结束—

参考文档:

iOS制作framework
iOS Framework合并

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

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

相关文章

Python基础篇(一):如何使用PyCharm创建第一个Python项目(包含tools)

如何使用PyCharm创建第一个Python项目 前言1.创建Python项目2. 创建第一个python文件3. 编写运行第一个python程序4. 关于此工具的相关使用 前言 环境版本Python3.11.4PyCharm2023.1.2OSwindows10 PyCharm是一款由JetBrains开发的强大的Python集成开发环境&#xff08;IDE&am…

单个springboot整合rabbitmq

一、rabbitmq的搭建 centos7搭建rabbitmq:centos7安装rabbitmq_java-zh的博客-CSDN博客 二、在什么情况下选择rabbitMQ 常见的四种MQ比较 特 性ActiveMQRabbitMQRocketMQKafka语言JavaErlangJavaScala单机吞吐万万十万十万时效性msusmsms(以内)可用性高&#xff08;主从架构…

模拟电路系列分享-复杂阻容电路的频响

目录 概要 整体架构流程 技术名词解释 技术细节 1.基本变形 2.单元串联的粗略计算 3.推广结论 小结 概要 在基本单元电路的基础上&#xff0c;熟悉一些常见的变形电路&#xff0c;学会判断是高通还是低通&#xff0c;快速计算出截止频率是多少&#xff0c;对求解复杂电路的频率…

TypeScript ~ 掌握基本类型 ①

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

MySQL高级sql语句操作二

MySQL高级sql语句操作二 一、EXISTS二、连接查询三、自我连接&#xff08;算排名&#xff09;四、CREATE VIEW&#xff08;视图&#xff09;五、UNION&#xff08;联集&#xff09;六、交集值七、无交集值八、CASE九、空值(NULL) 和 无值() 的区别十、正则表达式 一、EXISTS 用…

Kubernetes学习笔记-kubernetes应用扩展-自定义API对象(1)20230622

1、CustomResourceDefinitions介绍 开发者只需要只需向kubernetes api服务器提交CRD对象&#xff0c;即可定义新的资源类型。成功提交CRD之后&#xff0c;就能通过API服务器提交JSON清单或者YAML清单的方式创建自定义资源&#xff0c;以及其他kubernetes资源实例 创建一个CRD…

【雕爷学编程】Arduino动手做(118)---PS2接口模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

浅谈常见的加密算法及实现

浅谈常见的加密算法及实现 简介&#xff1a; 随着公司业务的发展&#xff0c;系统用户量日益增多&#xff0c;系统安全性问题一直在脑子里反复回旋&#xff0c;以前系统用户少影响面小&#xff0c;安全方面也一直没有进行思考和加固&#xff0c;现如今业务发展了&#xff0c;虽…

电力安全带安全帽穿戴监测算法

电力安全带安全帽穿戴监测算法通过TensorFlow机器学习的框架&#xff0c;电力安全带安全帽穿戴监测算法对人员的安全带和安全帽佩戴情况进行实时监测&#xff0c;当检测到有工作人员未正确佩戴安全帽或安全带时&#xff0c;电力安全带安全帽穿戴监测算法将自动发出警报提示现场…

论文精读 BlazePose结合LSTM 跌倒检测

Fall Detection for Shipboard Seafarers Based on Optimized BlazePose and LSTM 基于BlazePose-LSTM的海员跌倒检测 本博客通过全文翻译和总结的方式对论文进行精读。读完此论文颇受启发&#xff0c;比如&#xff1a; 视频中的时间序列问题&#xff1b;文章简单明了的整体脉…

29基于贝叶斯(Bayes)判别的机场航班延误因素分析(附matlab程序)

1.简述 学习目标&#xff1a; 基于贝叶斯判别的机场航班延误因素分析 利用所创建的朴素贝叶斯分类器对象ObjBayes&#xff0c;对训练样本进行判别 并利用贝叶斯预测误差统计 中国民航业近年来快速发展,航班量增多,航班密度逐步加大,许多资源配置的矛盾也日益凸显出来.机场大面…

Godot 4 源码分析 - 代码自动补全流程

使用Godot 4过程中&#xff0c;有一点比较吸引我&#xff1a;代码自动补全 用RAD开发时&#xff0c;代码自动补全功能一直被吐槽&#xff0c;主要是速度慢 但我看Godot 4中的Script编写过程中&#xff0c;代码补全很快&#xff0c;这个可以研究一下。 研究代码可找到&#x…

Linux国产操作系统,UCA-系统工程师学习必备技能,使用dpkg管理软件包、apt命令、内网获取依赖包及源码安装

目录 ​编辑 1.使用dpkg管理软件包 2.apt命令 3.内网获取依赖包 4.源码安装 1.使用dpkg管理软件包 第一种方法当然可以上网搜索软件安装包&#xff0c;下载然后解压成软件。 第二种也就是我接下来要介绍的&#xff0c;dpkg 命令&#xff0c;dpkg 全称叫做debian package…

Linux系统编程:进程的管理和创建

目录 一. 什么是进程 二. Linux对进程的管理方法 2.1 PCB描述进程 2.2 进程的组织 2.3 进程的查看 三. 子进程的创建 3.1 子进程创建函数fork的使用 3.2 子进程创建的原理 四. 总结 一. 什么是进程 进程&#xff08;process&#xff09;是指计算机中已经存在并运行的…

动态规划 DP (一)

1.动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09; 维基百科的定义说的很清楚&#xff1a; 动态规划不能解决所有的问题&#xff0c; 只能应用于有最优子结构的问题。例如背包问题、最长公共子序列问题、最短路径问题等。 最优子结构&#xff1a;局部…

Vue3通信方式之defineProps、defineEmits、useAttrs、插件mitt和v-model

目录 1、使用defineProps2、使用defineEmits接受自定义事件2.1原生DOM事件2.2自定义事件 3、全局事件总线&#xff08;插件mitt&#xff09;4、v-model5、useAttrs 1、使用defineProps props可以实现父子组件通信,在vue3中我们可以通过defineProps获取父组件传递的数据。且在组…

Opencv医学图片分割-以血管、胼胝体MR等分割为例

用到环境 1、pycharm community edition 2022.3.2 2、Python 3.10 后面应该会传代码到资源&#xff0c;比较需要的可以私信我。 总体设计 图1 扩展实验二“医学图像分割”流程图 ## 具体步骤 1. 导入OpenCV和NumPy库 2. 定义阈值分割方法threshold_segmentation&#xff0c;接…

spring框架-概述(spring特性、生命周期)(一)

文章目录 什么是springspring重要特性spring生命周期知识扩展 什么是spring Spring框架是一个开放源代码的J2EE应用程序框架&#xff0c;由Rod Johnson发起&#xff0c;是针对bean的生命周期进行管理的轻量级容器 ,是为了解决企业级编程开发中的复杂性&#xff0c;实现敏捷开发…

[进阶]网络通信:TCP通信-支持与多个客户端同时通信

目前我们开发的服务端程序&#xff0c;是否可以支持与多个客户端同时通信&#xff1f; &#xfeff;不可以的。&#xfeff;因为服务端现在只有一个主线程&#xff0c;只能处理一个客户端的消息。 代码演示如下&#xff1a; 客户端&#xff1a; public class Client {public…

SpringBoot 异常处理的最佳实践

SpringBoot 异常处理的最佳实践 在 Web 开发中&#xff0c;异常处理是非常重要的一环。在 SpringBoot 框架中&#xff0c;异常处理方式有很多种&#xff0c;但是如何选择最佳实践呢&#xff1f;本文将介绍 SpringBoot 异常处理的最佳实践&#xff0c;并附带代码示例。 异常处理…