iOS中SDK开发 -- cocoapods库创建
创始人
2024-06-03 11:04:08
0

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

相关内容

热门资讯

开晨会需要说什么内容 开晨会需要说什么内容晨会说的内容可以很多呀,可以说接下来的工作安排,也可以说,前期工作中的一些总结,...
有谁知道在鬼吹灯有声小说中前面... 有谁知道在鬼吹灯有声小说中前面有一段小女孩的声音念:人点烛 鬼吹灯... 这个版本的故事是谁讲的?周...
小蒂皮出自哪本书 小蒂皮出自哪本书小蒂皮出自哪本书我的野生动物朋友(蒂皮·本杰明·奥康迪·德格雷著图书)《我的野生动物...
盘古开天辟地的故事 盘古开天辟地的故事很久很久以前,天和地还没有分开,宇宙混沌一片。有个叫盘古的巨人一直睡在这混沌之中。...
英雄联盟中 赏金猎人怎么样? ... 英雄联盟中 赏金猎人怎么样? 多少钱 金币3150的ADC。入手的话不会吃亏,基本不会压箱底,很热门...
寻找一部累死何以笙箫默之类的小... 寻找一部累死何以笙箫默之类的小说也是辛夷坞的,叫山月不知心底事那就它的作者顾漫的其他小说呗 微微一...
大家谈谈对洪荒小说之中圣人的看... 大家谈谈对洪荒小说之中圣人的看法圣人不死,大盗不止都是人 人有的情绪他们都有 就是拳头大些对...
单位体检,自己一个人去害怕撞到... 单位体检,自己一个人去害怕撞到同事怎么办,不想别人看到观察我,漏出我不成熟样子,显出我的丑态。这让单...
鱼在天上飞? 鱼在天上飞?“鱼在天上飞,鸟在水里游”这句话的意思是鸟儿在水中的倒影就像是在水里游,天空在水中的倒影...
我想复婚,前夫说以后再,我改变... 我想复婚,前夫说以后再,我改变好了,他有可能追我,现在不想复婚,他有喜欢的女人了,我们就不可能了吗感...
原神草神什么时候复刻 原神草神什么时候复刻原神草神复刻是在3.6版本以后。草神纳西妲首次登场是逗腊3.2版本,新角色想要等...
网络拽姐语录小学生? 网络拽姐语录小学生?无论谁离开了你,请你别忘了,他没来之前,你本就是一个人生活。
有一部小说,女主小时候被男主收... 有一部小说,女主小时候被男主收养了,女主叫男主哥哥,男主对女主的我也在找这个小说我之前也看了,好像叫...
高层建筑立面大面积粉刷需要设伸... 高层建筑立面大面积粉刷需要设伸缩缝吗?高层建筑立面大面积粉刷需要设伸缩缝需要的,无正举论地面或立念清...
低头思故乡,为什么把杯思在长,... 低头思故乡,为什么把杯思在长,情愿何处在方歌曲叫什么名字“李白的歌”离开了家乡 背着沉沉的行囊开始了...
李白的诗有多少 李白的诗有多少典故中大多说是三千至四千首,现存不足一千首很多,总之不少~李白一生留下了九百六十多首诗...
怎么才可以学会拿得起放得下……... 怎么才可以学会拿得起放得下…… 有一段感情,正整3年了,可是我还是觉得分手那天就好像昨天发生的一样替...
为什么官方直播间买手机送耳机 为什么官方直播间买手机送耳机吸引消费者,增加销售量。官方直播间作为官方的直播平台,买手机送耳机是为了...
自考通还是一考通好?该选哪个? 自考通还是一考通好?该选哪个?我现在自考行政管理专科。专业课程我应该选自考通好还是一考通好呢?这个很...
淘宝实际付款价格为什么与订单价... 淘宝实际付款价格为什么与订单价格不符是这样的,我买了一双鞋,当时限价160我拍了下来,当时没付款,后...