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' do
  pod 'YourPrivateLibrary', '~> 1.0'
end
  • 本地库

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

target 'YourApp' do
  pod '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文件,然后将这个仓库对需要的厂商开放访问或者直接将这个仓库开源。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

讲解Linux中samba理论讲解及Linux共享访问

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放&#xff0…

监管数据治理治什么?1104、EAST、客户风险系统数据简介

近年来,随着经济社会数字化发展,商业银行逐步向数字化、智能化转型,监管部门对商业银行数据报送质量也越来越重视。自2020年5月9日工行、农行、中行、建行、交行、邮储、中信、光大8家商业银行因监管标准化数据(EAST)系…

漫画:什么是归并排序算法?

归并排序是建立在归并操作的一种高效的排序方法,该方法采用了分治的思想,比较适用于处理较大规模的数据,但比较耗内存,今天我们聊聊归并排序 一、排序思想 一天,小一尘和慧能坐在石头上,眺望着远方 分而治…

Qt5.12实战之QByteArray与字符指针及字符串转换

示例源码:#include <QCoreApplication> #include <QDebug> #include <QTextStream> static QTextStream cout (stdout,QIODevice::WriteOnly); #include <iostream> #include <QtGlobal> #include <QByteArray>void test() {qDebug() <…

进程调度的基本过程

这里写目录标题什么是进程进程管理结构体或类的主要属性pid内存指针文件描述符表辅助进程调度的属性并发并行并发什么是进程 进程是操作系统对一个正在运行的程序的一种抽象&#xff0c;也就是说&#xff0c;一个运行起来的程序就是一个进程。 进程又是操作系统进行资源分配的…

百度终于要出手了?文心一言

文心一言 百度全新一代知识增强大语言模型&#xff0c;文心大模型家族的新成员&#xff0c;能够与人对话互动&#xff0c;回答问题&#xff0c;协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。 前几天炒的风风火火的ChatGPT&#xff0c;虽然 ChatGPT 很强大&a…

【Error: ImagePullBackOff】Kubernetes中Nginx服务启动失败排查流程

❌pod节点启动失败&#xff0c;nginx服务无法正常访问&#xff0c;服务状态显示为ImagePullBackOff。 [rootm1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-f89759699-cgjgp 0/1 ImagePullBackOff 0 103…

【数据结构与算法】顺序表和链表

[数据结构与算法]顺序表和链表线性表线性表定义&#xff1a;顺序表静态顺序表动态顺序表动态顺序表的接口实现链表链表的概念链表的分类单向链表的接口实现双向链表循环的接口实现顺序表和链表的区别缓存利用率参考存储体系结构以及局部原理性存储体系结构Cache采用的程序访问的…

面试官问 : ArrayList 不是线程安全的,为什么 ?(看完这篇,以后反问面试官)

前言 金三银四 &#xff1f; 也许&#xff0c;但是。 近日&#xff0c;又收到金三银四一线作战小队成员反馈的战况 &#xff1a; 我不管你从哪里看的面经&#xff0c;但是我不允许你看到我这篇文章之后&#xff0c;还不清楚这个面试问题。 本篇内容预告&#xff1a; Array…

【基础算法】单链表的OJ练习(5) # 环形链表 # 环形链表II # 对环形链表II的解法给出证明(面试常问到)

文章目录前言环形链表环形链表 II写在最后前言 本章的OJ练习相对于OJ练习(4)较为简单。不过&#xff0c;本章的OJ最重要的是要我们证明为何可以这么做。这也是面试中常出现的。 对于OJ练习(4)&#xff1a;-> 传送门 <-&#xff0c;分割链表以一种类似于归并的思想解得&a…

ChatGPT-4 终于来了(文末附免费体验地址)

大家好&#xff0c;我是小钱学长。 ChatGPT4.0 重磅来袭&#xff0c;今天一打开plus页面出现的就是这个GPT-4的体验界面&#xff01;现在就带大家一起看看GPT4.0​。 进入之后是这样的 看到最下面有一行话&#xff0c;目前应该是4个小时限制100条消息。 GPT-4有什么优势&…

手把手学会DFS (递归入门)

目录 算法介绍 递归实现指数型枚举 递归实现排列型枚举 递归实现组合型枚举 算法介绍 &#x1f9e9;DFS 即 Depth First Search &#xff0c;中文又叫深度优先搜索&#xff0c;是一种沿着树的深度对其进行遍历&#xff0c;直到尽头之后再进行回溯&#xff0c;再走其他路线的…

springboot复习(黑马)

学习目标基于SpringBoot框架的程序开发步骤熟练使用SpringBoot配置信息修改服务器配置基于SpringBoot的完成SSM整合项目开发一、SpringBoot简介1. 入门案例问题导入SpringMVC的HelloWord程序大家还记得吗&#xff1f;SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计…

GPT-4技术报告

摘要 链接&#xff1a;https://cdn.openai.com/papers/gpt-4.pdf 我们汇报了GPT-4的发展&#xff0c;这是一个大规模的多模态模型&#xff0c;可以接受图像和文本输入并产生文本输出。虽然在许多现实场景中&#xff0c;GPT-4的能力不如人类&#xff0c;但它在各种专业和学术基…

数智链接,新一代校园招聘解决方案

疫情3年市场巨变&#xff0c;00后新生代初登上求职舞台&#xff0c;中和作用下&#xff0c;牛客发现新生代求职发生明显变化&#xff0c;企业校招也要随之而变&#xff0c;并率先提出以种草、精准、专业为特点的新一代校园招聘解决方案。01.学生求职变了&#xff01;安全感、非…

奇异值分解(SVD)原理与在降维中的应用

奇异值分解(SVD)原理与在降维中的应用 奇异值分解(Singular Value Decomposition&#xff0c;以下简称SVD)是在机器学习领域广泛应用的算法&#xff0c;它不光可以用于降维算法中的特征分解&#xff0c;还可以用于推荐系统&#xff0c;以及自然语言处理等领域。是很多机器学习算…

GPT-4来袭:开启人工智能新时代

文章目录介绍GPT4 模型演示示例示例 1示例 2示例 3示例 4示例 5最后Reference介绍 2023年3月15日&#xff0c;OpenAI公司正式发布了先进的自然语言处理模型GPT-4&#xff0c;前不久发布的GPT-3.5模型只能理解文字的语言模型&#xff0c;而新发布的GPT4则是多模态模型&#xff…

【java】了解常见集合类

了解常见集合类 一、集合类框架 1、集合类框架结构图 首先我们要对集合类结构有一个大体的认识&#xff0c;所有集合都继承于迭代器&#xff0c;分为单列集合和映射集合&#xff0c;单列集合分为有序可重复和有序不可重复&#xff0c;大概结构如下图所示 2、主要集合类的介…

你真的知道如何系统高效地学习数据结构与算法吗?

文章目录前言&#xff1a;什么是数据结构&#xff1f;什么是算法&#xff1f;学习这个算法需要什么基础&#xff1f;学习的重点在什么地方&#xff1f;一些可以让你事半功倍的学习技巧1.边学边练&#xff0c;适度刷题2.多问、多思考、多互动3.打怪升级学习法4.知识需要沉淀&…

文心一言---中国版的“ChatGPT”狂飙的机会或许要出现了

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…