iOS组件化实现

组件化简介

想要做组件化的前提当然得知道什么是组件化。顾名思义,组件化就是将APP拆分成各个组件(或者说模块也行),同时解除这些模块之间的耦合,然后通过主工程将项目所需要的组件组合起来。这样组件化过后的项目就变成了很多小模块,如果新项目中有类似的需求,直接将模块引入稍作修改就能使用了。
这种设计是不是很像引入三方库做快速开发?其实制作组件的过程就相当于做二方库。因此常见的组件化方案大多都是使用cocoapods做依赖管理。

优点:
  • 降低耦合度。组件化抽取出来是一个模块,可以直接用pods进行管理的;
  • 组件单独开发,单独测试。每个模块都可以由专门维护的人去进行单独开发,开发测试过程中,可以只编译自己那部分代码,不需要编译整个项目代码。
  • 组件化后项目的代码结构更加清晰,维护更加方便快捷;
  • 适合多人协助开发。各自负责维护各自的模块,明确团队开发的业务边界,增加团队协作效率。
缺点:
  • 增加了代码的冗余;
  • 增加了项目的复杂度;
  • 版本同步问题。
组件化拆分:
  • 基础组件拆分(宏定义、分类、工具类...)
  • 功能拆分(数据库、网络框架、图片加载...)
  • 业务拆分(登录、聊天、商城、社区...)
  • Router(负责模块之间的业务往来)
具体关于组件化方面的解释请参考链接以下

利用cocoapods创建基于git的私有库Spec Repo,我这里以创建PSGTools为例

首先说一下本地私有库的实现

打开终端,cd到需要存放的目录下,pod lib create PSGTools,出现Cloning https://github.com/CocoaPods/pod-template.git into PSGTools.,然后等待几分钟,依次回答以下问题。

What is your name? 
>这里输入名字,可以随便输
What is your email?
>这里最好是输入你gitee.com注册的邮箱
What platform do you want to use?? [ iOS / macOS ]
>iOS
What language do you want to use?? [ Swift / ObjC ]
>ObjC
Would you like to include a demo application with your library? [ Yes / No ]
>Yes
Which testing frameworks will you use? [ Specta / Kiwi / None ]
>None
Would you like to do view based testing? [ Yes / No ]
>No

输入完成之后就会自动创建这么一个工程。
PSGTools

然后将需要的文件放入PSGTools/PSGTools/Classes/目录下(具体的组件化分类我就不谈了,请看上面大佬们的链接吧),这里我就随便拖几个文件进行演示了,并删除ReplaceMe.m文件。
87FFDE76-60BC-4A92-925E-D0594A39F678.png

接着进入终端cd到Example目录下执行pod install,就能看到放入在Classes目录下的文件已经可以在pods下看到了,例如:
3DDB17D8-810C-457F-8E79-2972C9B73646.png

编译PSGTools工程,如果导入的文件还依赖于第三方库,在podfile文件中添加需要的三方库并pod install即可,工程编译通过就OK了。

然后在主项目中的podfile文件中添加

pod 'PSGTools', :path => 'PSGTools所在的目录'

终端执行pod install,就能看到主项目中多了以下依赖
7A7D95AE-E9B4-4132-8695-D41E68A7C26D.png

如果主项目中有重复的文件,需要删除主项目中的重复文件,然后编译运行通过就可以了,这样本地的就已经弄好了。

本地私有库和远端的连接(我这里使用的是码云的远端库管理)
  1. 选择新建仓库,仓库名称要与本地私有库一直,我这里是PSGTools,然后选择勾选私有,下面有勾选使用什么进行初始化,一个都不要勾选,点击创建,然后就可以看到以下命令行教程,我们选择已有仓库的命令行进行操作。
    B181F2DE-0555-47FB-8A28-AC56DBB3A96E.png
    1B68283B-FFA1-4567-8DAC-6F8AE53752A1.png
  2. 依照已有仓库命令行进行操作,打开终端,cd到私有库的目录下
cd xxxxx/PSGTools

输入

git remote add origin https://gitee.com/xxxx/xxx.git

再输入

git push -u origin master
  1. 刷新码云界面就可以看到已经上传上去了,但是这还没完,我们看到码云上面的PSGTools/Classes/目录下还是只有ReplaceMe.m文件,说明在终端并没有提交我们修改过的内容,继续回到终端执行以下命令
git add .
git commit -m '这里输入你要的提示的内容,例如:初始化'
git push origin master

这样我们就能在码云的Classes/目录下看到我们需要的内容了。

  1. 打开PSGTools.podspec文件,然后修改以下相对应的内容
    FE09C588-06D9-4A67-8205-2969B0F94F63.png
  2. 然后进入终端在PSGTools目录下对框架打tag标签,要对应.podspec里面的s.version

cd xxxxx/PSGTools
git tag 0.1.0
git push --tags
  1. 以上所有事情都做完了以后,剩下的就是将私有库的.podspec文件上传到本地Spec Repo。

这里要说一下Spec Repo

93D2A620-DD93-4334-AA61-CCA587CCCC08.png

看到上面文件夹显示,repos目录下默认只有master文件夹的,在终端中输入命令"pod repo"可以看到对应的master。

  • 现在我们需要使用自己的Repo管理自己的私有库框架,创建步骤如下
    1. 到码云平台创建一个新的仓库,例如PSGSpec,就可以拿到仓库地址:https://gitee.com/PSG/PSGSpec.git
    2. 然后在终端输入以下命令
    pod repo add [Private Repo Name] [GitHub HTTPS clone URL]
    
    [Private Repo Name] 是你本地需要用来管理私有库的spec名称
    [GitHub HTTPS clone URL]是你新建的这个管理私有库的仓库地址
    例如:pod repo add PSGSpec https://gitee.com/PSG/PSGSpec.git
    
    1. 这样就成功的创建了私有库管理仓库,可以到home目录下的/.cocoapods/repos目录下看到对应私有库名称的文件夹了,在终端使用"pod repo"命令也可以看到相对应的文件名称
  1. 私有库管理仓库创建好了之后就可以将私有库的.podspec文件上传到私有库管理仓库了
    1. 先验证.podspec文件是否可用,如果有任何WARNING或者ERROR都是不可以的,它就不能被添加到Spec Repo中,不过xcode的WARNING是可以存在的,验证需要执行一下命令
    pod lib lint
    避免警告pod lib lint --allow-warnings
    
    1. 再验证远程仓库,验证需要执行一下命令
    pod spec lint --allow-warnings
    
    1. 最后提交.podspec文件到仓库
    pod repo push PSGSpec PSGTools.podspec --allow-warnings
    

这样私有库的创建和配置就已经完成了,到主项目中的podfile文件中将

pod 'PSGTools', :path => '../iOS组件/PSGTools'

修改成

pod 'PSGTools', '~> 0.1.0'

然后在终端cd到工程目录下进行"pod install"

  • 这里在使用"pod install"的时候会出现下面这种错误
    PSGUI$ pod install
    Analyzing dependencies
    [!] Unable to find a specification for `PSGUtils (~> 0.1.0)`
    

说明是没有找到对应的库,因为默认是去GitHub上面去找的,但是我们现在这里的库是放在码云gitee上面的,如果需要让他去码云gitee上面去搜索我们的私有库,就需要在podfile文件内容最上面配置资源库地址。
C8B8B6E0-DD38-488B-8A0A-4B009D50C287.png

打开终端执行pod repo,就可以看到我们的私有库管理库Spec Repo,master是cocoapods默认的,其他的就是我们自己创建的私有库,这里我的私有库资源库的地址是

https://gitee.com/G_Q/PSGSpec.git

在podfile文件中添加以下内容

source 'https://gitee.com/xxxx/xxxx.git'
source 'https://github.com/CocoaPods/Specs.git'

例如我这里是这样子的
8684A146-2F12-4233-A1B5-162C0D88A6B3.png

这里为什么写上了自己的私有库地址之后还得加上cocoapods原有的库地址呢?因为如果加上了自己的资源地址之后,就只会在你添加的资源地址里面去寻找资源,但是我们项目开发中除了使用自己的私有库之外,经常还要使用到GitHub上面的公开库资源,所以要配上Github公开库资源地址。另外,如果我们有需要其他小伙伴的私有库资源,就需要再加上其他小伙伴们的资源地址。

加上了资源库地址我们就已经完成了,可以进行组件化的划分了,具体是按照什么来划分组件化的,可以查看最上面的那几个链接,看看大牛们是如何阐述组件化的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容