iOS项目组件化

简介: 随着公司业务的不断发展,团队不断壮大的同时,项目也随之臃肿起来,如何保障团队协作的高效,自然的想到了组件化这个话题。下面总结下本人的梳理和思考。

前言

随着公司业务的不断发展,团队不断壮大的同时,项目也随之臃肿起来,如何保障团队协作的高效,自然的想到了组件化这个话题。下面总结下本人的梳理和思考。

组件化

  • 为什么我们需要组件化 项目模块间的解耦、模块实现可重用、提升团队成员之间团队之间的协作开发效率、更方便单元测试。
  • 并不是所有的项目都适合组件化 如果你的项目较小,模块之间交互简单,耦合很少;模块没有被外部模块引用,只是一个单独的小模块;模块不需要重用,代码也很少被修改;团队规模很小。那么,你对项目就没有必要做组件化。

如果你的项目有以下三个特征以上,就要考虑下进行组件化了:

  1. 模块逻辑复杂,多个模块之间频繁互相引用
  2. 项目规模逐渐变大修改代码变的越来越困难(这里可以理解为:修改一处代码,需要同时修改其他多个地方);
  3. 团队人数变多,提交的代码经常和其他成员冲突
  4. 项目编译耗时较长
  5. 模块的单元测试经常由于其他模块的修改失败
  • 组件化的8条指标

一个项目经过组件化后如何来评判项目组件化是否彻底或者说是否优秀,可以通过以下几个方面:

  1. 模块之间没有耦合,模块内部的修改不影响其他模块;
  2. 模块可以单独编译
  3. 模块间数据传递明确
  4. 模块可以随时被另一个提供了相同功能的模块替换
  5. 模块对外接口清晰且易维护;
  6. 模块接口改变时,此模块的外部代码能够被高效重构
  7. 尽量用最少的修改和代码,让现有的项目实现模块化;
  8. 支持OC和Swift,以及混编。

前4条主要用于衡量一个模块是否真正解耦后4条主要用于衡量在项目实践中的易用程度

组件化分层

一般一个项目主要分为三层:业务层、通用层、基础层

image-20221010183722274.png

组件化封层之后,需要遵循一下原则:

  1. 只能 上层对下层 依赖, 不能 下层对上层 依赖(下层是对上层的抽象);
  2. 项目公共代码资源下沉;
  3. 横向的依赖尽量少有,最好下称到通用模块或者基础模块。

cocoapods组件化

1.创建远程私仓

  • 从git等代码托管平台或者公司的git仓库创建远程代码仓库
  • 本地仓库和远程仓库关联,并作为组件化工程目录。
    建议使用公司的git仓库,可以公开给需要的人员使用,也避免代码泄露问题。
    具体操作参考git的使用

2.创建组件模块工程

打开终端,cd到工程目录下执行命令:pod lib creat 组件名

如我的组件名称为:component-test, 命令:pod lib create component-test

image-20221010195132961.png

创建完成工程的目录如下:

image-20221010203703371.png

编译成功之后,就可以把自己整理的组件化相关的代码拖入到对应的目录Classes下

路径如下:

image-20221010204241595.png

测试组件化代码如下

IWComponent.h文件如下#ifndef IWComponent_h#define IWComponent_h#import "IWNStringRegex.h"#endif /* IWComponent_h */IWNStringRegex.h文件如下#import NS_ASSUME_NONNULL_BEGIN@interfaceIWNStringRegex : NSObject+ (BOOL)isValidEmail:(NSString*)email;
@endNS_ASSUME_NONNULL_ENDIWNStringRegex.m文件如下#import "IWNStringRegex.h"@implementationIWNStringRegex+ (BOOL)isValidEmail:(NSString*)email{
NSString*emailRegex=@"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate*emailTest= [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTestevaluateWithObject:email];
}
@end

3.使用示例应用程序测试组件功能

  • Classes 中的文件修改后,打开终端cd到Example下进行 pod install (刚才添加到 Classes 中的文件夹 pod 进来)

image-20221010201904673.png

  • 引入头文件,使用相应的功能
#import "IWViewController.h"#import "IWComponent.h"@interfaceIWViewController ()
@end@implementationIWViewController- (void)viewDidLoad{
    [superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.NSString*email=@"fan@iw.com";
BOOLisEmail= [IWNStringRegexisValidEmail:email];
NSLog(@"是否是邮箱:%d", isEmail);
}
- (void)didReceiveMemoryWarning{
    [superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.}
  • 测试结果:
2022-10-1020:50:29.628168+0800component-test_Example[1448:25782] 是否是邮箱:1

4.修改 podspec 文件

  • 编译示例应用工程,测试组件通过,开始修改 podspec 文件。

一般修改一下几个内容:

  1. 修改版本号
  2. 修改项目的简单概述和详细概述
  3. 修改 homepage 和 source 地址
  4. 添加依赖库

podspec常用字段含义和修改如下

## Be sure to run `pod lib lint component-test.podspec' to ensure this is a# valid spec before submitting.## Any lines starting with a # are optional, but their use is encouraged# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html#Pod::Spec.newdo |s|
s.name='component-test's.version='0.1.0's.summary='组件的简介'# This description is used to generate tags and improve search results.#   * Think: What does it do? Why did you write it? What is the focus?#   * Try to keep it short, snappy and to the point.#   * Write the description between the DESC delimiters below.#   * Finally, don't worry about the indent, CocoaPods strips it!s.description=<<-DESC  组件的详细描述                       DESC# s.homepage 作者主页地址  s.homepage         = 'https://gitee.com/taijuios'  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'  #license 开源协议  s.license          = { :type => 'MIT', :file => 'LICENSE' }  # author 作者信息  s.author           = { 'wangtaiju' => 'wang.taiju@iwhalecloud.com' }  # source 组件地址,需要组件的git远程仓库地址一致  s.source           = { :git => 'git@gitee.com:taijuios/component-test.git', :tag => s.version.to_s }  # s.social_media_url = 'https://twitter.com/'  # ios.deployment_target 平台和运行最低系统  s.ios.deployment_target = '10.0'  # source_files 组件源代码路径  s.source_files = 'component-test/Classes/**/*'  # resource_bundles 组件所需资源路径,如图片  # s.resource_bundles = {  #   'component-test' => ['component-test/Assets/*.png']  # }  # public_header_files 对外公开的头文件   s.public_header_files = 'Pod/Classes/IWComponent.h'  # s.frameworks = 'UIKit', 'MapKit'  # dependency 依赖的第三方库  # s.dependency 'AFNetworking', '~> 2.3'end

具体语法参考pod官方:https://guides.cocoapods.org/syntax/podspec.html

5.验证podspec文件

编译通过后,终端cd到组件应用根目录, 提交代码到远程仓库,并打tag

git add .
git commit -m"description"git push origin master
git tag 版本号 (注:这里的版本号必须和 podspec 里写的版本号一致)
git push --tags

执行一下命令:

pod spec lint --verbose --allow-warnings --use-libraries

备注:如果远程仓库和podspec文件中的source地址不一致会报错,远程仓库先打tag,tag需要和podspec文件version一致,否则也会报错不通过。

编译常用的一些命令如下:可以根据需求来选择

--use-libraries 开启库编译

--allow-warnings 允许告警

--sources=3rdlib 第三方依赖

--skip-import-validation 跳过验证

--skip-tests 跳过测试

--verbose 输出日志,

终端显示:component-test.podspec passed validation. 表示成功。

6.提交podspec文件索引

  • 添加pod repo
    pod repo add 'repo名称' 远程仓库地址
pod repo add gitee git@gitee.com:taijuios/component-test.git
  • 验证并提交podspec到远程仓库
pod repo push gitee component-test.podspec --verbose --allow-warnings --use-libraries
  • 备注:pod repo 都远程仓库和podspec文件source需要一致。
    完成后可以在本地cocoapods中看到版本索引了
    image-20221011114036776.png

7.测试

  • 新建一个pod管理应用工程
  • Podfile指定组件源和tag
pod'component-test', :git=>'git@gitee.com:taijuios/component-test.git', :tag=>'0.1.0'
  • pod install,并正常使用则成功。


相关文章
|
2月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
121 1
|
3月前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
5月前
|
Java Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【7月更文挑战第8天】在移动应用开发的广阔天地中,Android与iOS两大平台各自占据着半壁江山。本文将深入探讨这两个平台在开发环境、用户界面设计、性能优化以及市场覆盖等方面的根本差异,并分析这些差异如何影响项目的成功。通过比较和分析,旨在为开发者在选择平台时提供更全面的视角,帮助他们根据项目需求和目标市场做出更明智的决策。
|
5月前
|
Linux Android开发 iOS开发
安卓与iOS开发:平台选择对项目成功的影响
在移动应用开发的广阔舞台上,安卓与iOS两大操作系统各自占据着举足轻重的地位。本文深入探讨了这两个平台在技术特性、市场覆盖、用户群体和开发成本等方面的差异,并分析了这些差异如何影响项目的最终成功。通过比较分析,旨在为开发者提供决策依据,帮助他们根据项目需求和目标受众做出明智的平台选择。
|
6月前
|
Java 开发工具 Android开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
在移动应用开发的广阔天地中,Android和iOS两大平台各自占据着半壁江山。本文将深入探讨这两个平台在开发过程中的关键差异点,包括编程语言、开发工具、用户界面设计、性能优化以及市场覆盖等方面。通过对这些关键因素的比较分析,旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和目标受众做出明智的平台选择。
|
3月前
|
IDE 开发工具 Android开发
安卓与iOS开发对比:平台选择对项目成功的影响
【9月更文挑战第10天】在移动应用开发的世界中,选择正确的平台是至关重要的。本文将深入探讨安卓和iOS这两大主要移动操作系统的开发环境,通过比较它们的市场份额、开发工具、编程语言和用户群体等方面,为开发者提供一个清晰的指南。我们将分析这两个平台的优势和劣势,并讨论如何根据项目需求和目标受众来做出最佳选择。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解每个平台的特性,并指导你做出明智的决策。
|
3月前
|
Java 开发工具 Android开发
安卓与iOS开发:平台选择对项目成功的影响
在移动应用开发的浩瀚宇宙中,安卓和iOS两大星系璀璨夺目,各自拥有独特的光芒。本文将穿梭于这两个平台之间,探讨它们在开发环境、用户群体、成本效益等方面的差异,以及这些差异如何影响一个项目的航向和终点。我们将从初学者的视角出发,逐步深入,揭示选择合适平台的重要性,以及如何根据项目需求做出明智的选择。无论你是即将启航的新手开发者,还是已经在这片星海中航行的老手,这篇文章都将为你提供有价值的导航信息。
62 2
|
3月前
|
Java 开发工具 Android开发
探索安卓与iOS开发的差异:平台选择对项目的影响
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据着重要的位置。本文旨在深入探讨这两个平台在开发过程中的主要差异,包括编程语言、开发工具、用户界面设计、性能优化以及市场分布等方面。通过对比分析,我们将揭示平台选择如何影响项目规划、执行效率和最终成果,为开发者在选择适合自己项目需求的平台时提供参考依据。
|
4月前
|
IDE 开发工具 Android开发
探索安卓与iOS开发的差异:平台选择对项目成功的影响
在移动应用开发的广阔天地中,安卓和iOS两大平台各领风骚,引领着技术进步的潮流。本文旨在深入剖析这两个平台在开发过程中的关键差异点,包括编程语言、开发工具、用户界面设计以及市场分布等方面。通过对比分析,我们不仅能更好地理解每个平台的独特优势,还能洞察这些差异如何影响项目决策和最终成果。无论你是开发者还是企业决策者,了解这些内容都将助你一臂之力,在选择适合自己项目的开发平台时做出更明智的决策。
|
4月前
|
IDE 开发工具 Android开发
探索iOS与安卓开发的差异:平台选择对项目成功的影响
【8月更文挑战第22天】在数字化时代,移动应用成为企业和个人展示创意、提供服务的重要工具。iOS和安卓作为两大主流平台,各自拥有独特的优势和限制。本文将深入探讨这两个平台在开发过程中的主要差异,以及这些差异如何影响项目规划、用户体验和市场策略。通过比较分析,旨在为开发者和企业决策者提供有价值的见解,帮助他们根据项目需求做出明智的平台选择。