iOS组件化开发之路(CTMediator),涉及到cocoapods本地库、远程私有库、远程公开库(一)

以下文章为本人研究组件化之后的理解,对于这一路上的种种不明确问题及查询了好多博客上错误的资料,一路采坑过来有了如下总结,如有错误,欢迎大神指出。

iOS的组件化分为什么?这里注意是分为,什么,不是分,为什么

这还分为什么么?当然。

其实我们平时使用cocoapods的公开库也算是组件化的一种。

一、按照存储方式分

  1. 本地库
  2. 远程私有仓库
  3. 远程公开仓库
    自己项目的组件化可以用前两种(1.本地库、2.远程私有仓库)方式。
    这几个库有什么区别呢?

本地库

项目和索引文件都存储在你本地,pod之后需要用path配你本地的路径

远程私有仓库

需要给索引文件创建一个仓库,需要给你封装的组件创建一个仓库,将组件打上tag版本关联到索引的文件

远程公开仓库

这个就是我们平时正常引用三方开源框架的方式pod "AFNetworking"啊。。。

二、按照项目结构分

1.单个项目的多个组件
2.多个项目的多个组件

单个项目的多个组件

这个就是你有一个主项目,将登录、新闻详情、购物车等等的功能独立成组件。

多个项目的多个组件

这个就好比有一个项目叫淘宝,你搜索出来一堆天猫的商品,需要跳转到天猫的商品详情页,但是你不能把天猫的代码粘过来呀,更不能把文件拷贝一份过来呀,这个时候怎么办呢,不要慌,叫天猫项目的开发人员将他的商品详情抽成一份组件出来,上传到远程仓库,这个仓库需要创建成私有的,因为自己写的项目可不能随便给公开喽,你在工程里pod一下,天猫的详情页就过来,这个跟公开的库用法一样,其实在项目里直接#import <TmallDetailViewController.h>就可以用了,没毛病。但是,看好了啊,但是来了,这样是不是两个工程就关联上了,这不是我们想要的啊,我们想要的是解耦,将耦合度将到最低最低,此时就要用到CTMediator这个三方库了,用这个路由将两个项目解耦。
理论就说到这里,下面开始实践
等等落了句话,其实按照项目结构分的“单个项目的多个组件”和“多个项目的多个组件”只是叫法上不一样,他们在实践上是一样的,因为登录、新闻详情他们抽出来的单个组件也是在一个独立的项目中,这也是一个单独的项目,只是没有它的主功能罢了。
下面开始真的实践了


这里我只需要讲:本地库 + 路由到页面和远程私有库 + 路由到页面这两个组件化模式。
下面开始操作


好多博客里面都是用 pod lib create 这种直接创建模板工程的方式去创建,但是我不喜欢这样,对于本来不熟的人操作就够乱套的了在加上这一手会更加乱套。

一、本地库创建 + 组件化

1. 首先创建一个空文件夹这里我们起名ShoppingProject,用来容纳我们的主工程和组件工程,放到一起不乱套。
image.png
2. 创建主工程
image.png

版本号这块要注意一下,所有工程的版本号要设置成一样的,包括一会我们创建的索引文件也要设置成一样的,这里我选的iOS10.0


image.png
3. 工程基础代码设置一下还有证书什么的自己配置一下,保证工程可以跑起来

创建好之后应该是这样的


image.png

image.png

模拟器应该是这样的


image.png
4. 创建组件工程,这里我们做登录的组件页LoginComponent
image.png

此时创建完成你的ShoppingProject文件夹应该是这样的


image.png
5. 配置一下工程的版本号证书及基本设置等等
6. 新建LoginViewController文件夹,继承UIViewController的控制器
image.png
7. 设置Appdelegate.m和LoginViewController.m文件
image.png

image.png

跑起来的模拟器


image.png
8. 新建Targets文件夹,继承NSObject创建一个类,名字先跟我起一样的这个地方在路由有映射,所以名字一定要对应取好,这个就是组件工程为主工程开放出来的接口
image.png
9. Target_Login中的代码
image.png

image.png

主工程和组件工程到此就整完了,下面我们开始创建CTMediator的分类工程,这个工程是用来连接主工程与组件工程的桥梁,是我们实现工程解耦的关键一步

10. 创建LoginComponent_Category工程
image.png

创建好后的工程目录


image.png
11. 配置版本号和证书描述文件啦 等等。。。
12. 配置好后关闭工程,打开终端,我们要为LoginComponent_Category工程通过cocoapods引入三方框架CTMediator

进入到LoginComponent_Category工程目录

$ touch Podfile

编辑Podfile文件

platform :ios, '10.0'

target 'LoginComponent_Category' do
    pod 'CTMediator'
end
$ pod install
13. 使用LoginComponent_Category.xcworkspace打开工程,创建对应文件夹及CTMediator的分类

image.png

CTMediator+Login.h和CTMediator+Login.m中的代码
image.png

image.png

这个地方就是这么映射的
image.png

三个项目到这里就差不多了,下面我们开始配置podspec,这个就是用来创建pod索引的,有了这个文件才能被别的项目pod进去

14. 打开终端进入LoginComponent工程的根目录

创建索引依赖文件

$ pod spec create LoginComponent

执行之后会在你的工程目录里多出这么一个文件


image.png

LoginComponent.podspec文件配置

Pod::Spec.new do |spec|
  spec.name         = "LoginComponent"
  spec.version      = "0.0.1"
  spec.summary      = "A short description of LoginComponent."
  #spec.homepage     = "http://EXAMPLE/LoginComponent"
  spec.author             = { "Cloud" => "haohao10987@163.com" }
  spec.platform     = :ios, "10.0"
  #spec.source       = { :git => "http://EXAMPLE/LoginComponent.git", :tag => "#{spec.version}" }
  spec.source_files  = "LoginComponent/LoginComponent/LoginViewController/**/*.{h,m}", "LoginComponent/LoginComponent/Targets/**/*.{h,m}"
end

看到下图中两个画框的文件位置了吗,我们要为这两项配置去创建一个远程的仓库,因为是本地库嘛,我也不想创建,但是这两项不填写正确的在pod install的时候会报错,所以我们需要为它创建一个远程仓库,这里我们创建一个私有的远程仓库,对了,远程仓库我用的码云(这里的远程私有仓库和前面说的远程私有库 + 路由这种配置方法没关系,这里我们只是用了一下库的链接,真正要用到私有库还需要为私有库配置spec的工程和关联索引,不理解没关系,一会我讲远程私有库 + 路由的时候再去理解)


image.png

仓库的使用我这里不多做介绍,创建好后自己把项目关联好,在上图红框的位置填入相应链接


image.png

传完之后我的项目目录结构就变成这样子的了
image.png

修改LoginComponent.podspec文件


image.png
15. 修改Shopping工程的Podfile文件
image.png

这块是方便你复制粘贴的

platform :ios, '10.0'

target 'Shopping' do
    pod 'LoginComponent', :path => "../LoginComponent"
end
16. 终端进入到Shopping文件夹,执行
$ pod install

紧接着在Development Pods就会出现我们的Pods项目中(跟公开库直接在Pod文件夹中不太一样)


image.png

到此为止,组件工程已经被我们引入到主工程中了,但是为了解耦,主工程和组件工程不可以直接相互调用,下面我们开始制作“LoginComponent_Category”这个分类组件工程的本地库,然后引入到主工程中。

17. 有了上一次的经验我们先为“LoginComponent_Category”分类组件工程创建它的远程私有仓库
image.png

这是关联好之后的目录层级


image.png
18. 打开终端,为“LoginComponent_Category”分类组件工程创建podspec项目依赖索引文件

进入到LoginComponent_Category根目录

$ pod spec create LoginComponent_Category

创建好之后的样子


image.png
19. 配置LoginComponent_Category.podspec文件
image.png

没错,下面这段是方便你复制粘贴的

Pod::Spec.new do |spec|
  spec.name         = "LoginComponent_Category"
  spec.version      = "0.0.1"
  spec.summary      = "A short description of LoginComponent_Category."
  spec.homepage     = "https://gitee.com/moment_forever/LoginComponent_Category"
  spec.author             = { "Cloud" => "haohao10987@163.com" }
  spec.platform     = :ios, "10.0"
  spec.source       = { :git => "https://gitee.com/moment_forever/LoginComponent_Category.git", :tag => "#{spec.version}" }
  spec.source_files  = "LoginComponent_Category/LoginComponent_Category/LoginComponent_Category/**/*.{h,m}"
  spec.dependency "CTMediator"
end
20. 在主工程的Podfile文件里配置
platform :ios, '10.0'

target 'Shopping' do
    pod 'LoginComponent', :path => "../LoginComponent"
    pod 'LoginComponent_Category', :path => "../LoginComponent_Category"
end
21. 终端进入Shopping主工程文件夹执行
$ pod install

接下来打开我们的主工程就会看到


image.png
22. 紧接着修改我们的主控制器
image.png
23. 最后运行模拟器跑起来,在首页点击view空白处会跳转到登录页
image.png

至此,iOS使用本地库进行组件化开发就已经结束了,这个组件化适合用在什么工程中呢

  • 单人开发单项目,将功能组件化。
  • 单人开发多项目,将公用的功能组件化。
  • 多人开发单项目,将功能组件化。
  • 多人开发多项目,将公用的功能组件化。
    这里我要强调一下“多人开发多项目”,当多个人开发多个项目时会有两种情况:一个是多个人每个人都有权限去开发所有项目;第二个多个人开发多个项目,每个人只有权限去开发自己的项目,但是这几个项目中还是有公共的模块或者组件需要抽出来,这就不适合使用本地化的组件了,由此引出了“远程私有库 + 路由进行组件化开发”,我决定再写一篇文章去记录,两项内容写在一篇博客里面实在是太长了
    iOS组件化开发之路(CTMediator),涉及到cocoapods本地库、远程私有库、远程公开库(二)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345