当前位置: 首页 > news >正文

iOS中SDK开发 -- cocoapods库创建

在iOS项目中,经常使用cocoadpods来进行依赖管理以及三方库引入等。引入的三方库一般会有几种形式:一、在Pods目录下可以直接看到源代码的开源库,如AFNetworkingMasonry等常见开源库。二、在Pods目录下拉取的项目文件只能看到对应的头文件资源文件的闭源库,如AlipaySDKWechatOpenSDK等,这种三方库一般涉及到商业逻辑和安全性方面的考量,不能开源。其中,AlipaySDK是以.framework的形式提供给用户,WechatOpenSDK则提供.a的文件形式。本文说明了iOS中动静态库的一些基本概念,以及系统描述了如何创建一个自定义.a或者.framework库,并通过cocoapods的形式供三方厂商使用。

静态库和动态库的区别和使用场景

iOS项目中经常使用到的三方库有.a文件、.framework文件或者.dylib文件。

.framework

FrameworkiOS/MacOS平台下的一种打包方式,将编译生成的二进制文件、头文件、资源文件统一打包。最后生成的文件可以是静态库也可以是动态库,iOS8以后允许创建自定义的framework。但是,使用到的系统的framework是动态库,而自己创建的自定义framework则是静态库。

.dylib

.dylib为动态库。

.a

.a是纯二进制文件,可以将不希望别人看到的源文件封装起来。提供给三方使用时,需要与.h文件配合使用。

动态库与静态库区别

动态库在编译中不会被拷贝到目标程序中,只有程序真正运行起来,才会被加载使用。像系统的的UIKit.framework等动态库,iPhone中的每个app都会用到,但并不会都拷贝一份到各自的app,而是共用系统中的一份。这样就会减少App的大小,同时,如果系统升级,也方便对整个库进行替换,不需要每个app都打包一遍。

静态库则刚好和动态库相反,编译的时候会被直接拷贝一份,复制到目标程序中,这样最终编译出来的ipa包体积会增大。但是,其优点是使用方便。

在iOS8之前,系统并没有开放自定义的framework开发,创建的framework其实也是静态文件。iOS8之后,可以创建自定义的framework动态库,但是跟系统提供的还是有区别,整个库文件依然会被复制到iOS的目标App中。所以,对于我们来说,自定义的framework其实也是一个升级版的静态库。

在我们实际开发自己的SDK时,使用framework.a文件都是比较常用的方式。两者的主要区别是framework将头文件、资源文件、二进制文件都打包在一起,方便使用。而.a文件则只是一个纯静态文件,需要同时配合.h头文件来使用。如下则是AlipaySDK-iOSWechatOpenSDK分别使用.framework.a的两种形式。

AlipaySDK-iOSWechatOpenSDK
截屏2023-03-13 13.53.34截屏2023-03-13 13.51.54

CocoaPods库创建及使用

我们要开发SDK供三方厂家使用,则面临许多问题需要解决。如:SDK中可能会依赖其他的三方库,而客户的项目中也可能会包含同样的三方库;集成过程可能会比较复杂;版本控制问题。并且,在开发过程中SDK也是要不断地运行和测试的,如果使用最原始的方法,不断地导出再导入到Demo项目中,整个开发过程会变得非常复杂和繁琐。

所以我们开发方式也选取目前iOS中最常用的三方库和框架管理工具:CocoaPods。创建一个我们自己的CocoaPods库进行开发和发布SDK项目。

CocoaPods与git库关系和结构

平时我们会在两个地方找到cocopods三方库的集成说明,一个是github等开源网站上,会看到源码中包含有.podspec文件,并一般会在README.md文件中有集成说明。另一个则是在一些三方厂商的说明文档中,如微信开放平台JPush等官方文档。

github中,我们看到的是源码和pod配置文件所在位置。我们真正使用pod install下载安装三方库的时候,其源码文件则是从CocoaPods官方库中下载的。

CocoaPods 官方库、私有库、本地库

  • 官方库

CocoaPods官方库是CocoaPods维护的一个官方仓库,我们所使用的大部分三方库都是从官方库中下载下来的。

  • 私有库

我们也可以不将开发好的库提交到CocoaPods官方库,而是存放在自己的私有仓库中。这样,可以自由控制访问权限,一般公司项目进行组件化开发时候比较常用。在Podfile中,只需要添加私有库的source源即可。如下:

source 'https://github.com/yourPrivateRepo/yourPrivateSpecs.git'target 'YourApp' dopod 'YourPrivateLibrary', '~> 1.0'
end
  • 本地库

本地库则是pod库在本地磁盘上存放,在项目中使用时,直接在Podfile中添加本地路径。如下:

target 'YourApp' dopod 'YourLocalLibrary', :path => '/path/to/your/local/library'
end

CocoaPods库创建

使用命令创建SDK项目库

pod lib create DemoSDK

接下来会有几个问题需要挨个输入,根据各自的配置进行输入。

截屏2023-03-13 16.57.36

接着会自动创建项目以及demo项目,并自动运行Pod install并打开项目文件。生成的项目结构如下所示:

截屏2023-03-13 16.59.54

在这里,由于我电脑的配置,创建好的.podspec文件中s.homepage.author以及s.source默认使用了我的github账号的相关信息。

.podspec文件对于pod库的创建至关重要,根据不同的需求来修改配置相关的参数来实现最终需求。

CocoaPods库中隐藏源码,只上传编译完成后的framework

创建完SDK项目文件后,因为我们的项目是要给三方厂商使用,不管是使用私有库还是共有库提供给对方,都不能将自己的源码暴露出来。所以我们目前最大的需求就是不能将SDK源码暴露,只能提供最终编译好的.a或者.framework文件。

要实现类似AlipaySDKWechatOpenSDk只提供二进制文件,不暴露源码,需要满足两个条件

  1. 将源码上传到git私有库中

这个很好理解,如果项目git仓库本身是公开的,则源码也就是无法隐藏了。

  1. 修改.podspec文件参数,去掉s.source_files参数,并添加s.vendored_frameworks字段。

s.source_files参数指定了源文件在本地的路径,在.podspec文件中去掉s.source_files字段后,则使用pod trunc push命令不会将源文件上传到CocoaPods官方库中。

如果使用git私有库给第三方使用,则第三方厂商必须有用这个仓库的访问权限才可以使用。如果这种情况下也需要对第三方厂商隐藏源文件,则最好创建一个新的私有库,只存放最终生成的.a文件和.framework以及.podspec文件,然后将这个仓库对需要的厂商开放访问或者直接将这个仓库开源。

相关文章:

iOS中SDK开发 -- cocoapods库创建

在iOS项目中,经常使用cocoadpods来进行依赖管理以及三方库引入等。引入的三方库一般会有几种形式:一、在Pods目录下可以直接看到源代码的开源库,如AFNetworking,Masonry等常见开源库。二、在Pods目录下拉取的项目文件只能看到对应…...

2023年了,还是没学会内卷....

先做个自我介绍:我,普本,通信工程专业,现在飞猪干软件测试,工作时长两年半。 回望疫情纪元,正好是实习 毕业这三年。要说倒霉也是真倒霉,互联网浪潮第三波尾巴也没抓住,狗屁造富神…...

chatGPT爆火,什么时候中国能有自己的“ChatGPT“

目录 引言 一、ChatGPT爆火 二、中国何时能有自己的"ChatGPT" 三、为什么openai可以做出chatGPT? 四、结论 引言 随着人工智能技术的不断发展,自然语言处理技术也逐渐成为了研究的热点之一。其中,ChatGPT作为一项领先的自然语言处理技术…...

【Matlab算法】粒子群算法求解一维非线性函数问题(附MATLAB代码)

MATLAB求解一维非线性函数问题前言正文函数实现(可视化处理)可视化结果前言 一维非线性函数是指函数的自变量和因变量都是一维实数,而且函数的形式是非线性的,也就是不符合线性函数的形式。在一维非线性函数中,自变量…...

2023 最新发布超全的 Java 面试八股文,整整 1000道面试题,太全了

作为一名优秀的程序员,技术面试都是不可避免的一个环节,一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识。 2023 年的互联网行业竞争越来越严峻,面试也是越来越难,很多粉丝朋友私信希望我出一篇面试专题或…...

产品经理面经|当面试官问你还有什么问题?

相信很多产品经理在跳槽面试的时候,在面试尾声都会遇到这样的环节,面试官会问你有什么问题要问的,一般来说大家都能随时随地甩出几个问题来化解,但其实在这个环节对于应聘者来说也是一个很好的机会来展现自己的能力,甚…...

单链表的基本操作

目录 一.链表的基本概念和结构 二.链表的分类 三.单链表的基本操作 1.创建一个节点 2.打印 3.尾插 4.头插 5.尾删 6.头删 7.查找 8.指定位置插入 9.指定位置删除 10.销毁 一.链表的基本概念和结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结…...

【微信小程序-原生开发】系列教程目录(已完结)

01-注册登录账号,获取 AppID、下载安装开发工具、创建项目、上传体验 https://sunshinehu.blog.csdn.net/article/details/128663679 02-添加全局页面配置、页面、底部导航 https://sunshinehu.blog.csdn.net/article/details/128705866 03-自定义底部导航&#x…...

JavaEE--Thread 类的基本用法(不看你会后悔的嘿嘿)

Thread类是JVM用来管理线程的一个类,换句话说,每个线程都唯一对应着一个Thread对象. 因此,认识和掌握Thread类弥足重要. 本文将从 线程创建线程中断线程等待线程休眠获取线程实例 等方面来进行具体说明. 1)线程创建 方法1:通过创建Thread类的子类并重写run () 方法 class M…...

MySQL数据库基本使用(二)-------数据库及表的增删改查及字符集修改

1.MySQL数据库的使用演示 1.1创建自己的数据库 命令格式如下(创建的数据库名称不能与已经存在的数据库重名): mysql> create database 数据库名;例如: mysql> create database atguigudb; #创建atguigudb数据库&#xf…...

互联网摸鱼日报(2023-03-17)

互联网摸鱼日报(2023-03-17) InfoQ 热门话题 开源新生代的成长之路:从校园到开源,需要迈过哪些挑战? 从 Clickhouse 到 Apache Doris,慧策电商 SaaS 高并发数据服务的改造实践 刚刚,百度文心…...

【前后端】低代码平台Jeecg-Boot 3.2宝塔云服务器部署流程

1 后端 部署流程 修改配置文件 更改数据库、redis的配置。 在system子模块中的target文件夹下生成 jar 包jeecg-boot-module-system-3.2.0.jar。 复制到云服务器 生成数据库 在这里插入图片描述 使用命令运行后端程序 java -jar ./jeecg-boot-module-system-3.2.0.jar宝…...

leetcode todolist

数组 数组的改变、移动 453. 最小移动次数使数组元素相等 665. 非递减数列 283. 移动零 数组的旋转 189. 旋转数组 396. 旋转函数 统计数组中的元素 645. 错误的集合 697. 数组的度 448. 找到所有数组中消失的数字 442. 数组中重复的数据 41. 缺失的第一个正数 数…...

改进YOLO系列 | CVPR2023最新 PConv | 提供 YOLOv5 / YOLOv7 / YOLOv7-tiny 模型 YAML 文件

DWConv是Conv的一种流行变体,已被广泛用作许多神经网络的关键构建块。对于输入 I ∈ R c h w I \in R^{c \times h \times w} I∈...

像ChatGPT玩转Excel数据

1.引言 最近ChatGPT的出现,把人工智能又带起了一波浪潮。机器人能否替代人类又成了最近热门的话题。 今天我们推荐的一个玩法和ChatGPT有点不一样。我们的课题是“让用户可以使用自然语言从Excel查询到自己想要的数据”。 要让自然语言可以从Excel中查数据&#…...

云原生之docker容器监控详解(cAdvisor、node exporter、prometheus)

docker容器监控一、前言二、cAdvisor2.1、安装cAdvisor2.2、使用Prometheus监控cAdvisor2.3、cAdvisor暴露的Prometheus指标三、Node Exporter3.1、安装Node Exporter3.2、指标四、Prometheus4.1、安装4.2、规则配置4.3、报警管理器五、grafana一、前言 cAdvisor源码 node exp…...

<Linux>进程概念

文章目录一、什么是进程1.进程概念2.进程描述 – PCB3.task_struct内容分类二、进程的基本操作1.查看进程2.结束进程3.通过系统调用获取进程标示符4.通过系统调用创建子进程(fork)三、进程状态1.普遍的操作系统状态2.Linux操作系统状态四、两种特殊的进程1.僵尸进程2.孤儿进程五…...

数据结构——顺序表

文章目录🐨0. 前言🎈1. 顺序表的概念及定义🪁2. 接口的声明🪄3. 接口的实现🍅3.1 为何使用断言?🍒3.2 初始化与销毁🍓3.3 尾插与尾删🍉3.4 头插与头删🍹3.5 指…...

闪存系统性能优化方向集锦?AC timing? Cache? 多路并发?

1. 从Flash系统的性能提升说起从消费级产品到数据中心企业级场景,NAND Flash凭借其高性能、大容量、低功耗以及低成本等特性大受欢迎,是目前应用最为广泛的半导体非易失存储介质。为了满足业务场景越来越严苛的性能要求,人们想了许多方法来提…...

【每日一题】——网购

🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟢 读书笔记 🟡 C语言跬步积累 🌈座右铭:广积粮,缓称…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

LLM基础1_语言模型如何处理文本

基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...