当前位置: 首页 > 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语言跬步积累 🌈座右铭:广积粮,缓称…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

什么是EULA和DPA

文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

Web后端基础(基础知识)

BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...