iOS 组件化
组件化 VS 模块化
网上有很对对于这两个概念的解释,这里我简单总结下自己对这两个概念的理解:
- 组件化:功能组件的封装,
粒度比较小
,我们用cocoapods安装的依赖基本上就属于这个概念。 - 模块化:业务模块的封装,一个APP按业务划分为若干个模块,最简单的就是
按Tab页划分
,还有最基本的登录注册模块
等。这些模块独立开发一方面可以用于公司中同类APP开发复用,还有一方面是可以降低整个APP的开发复杂度,每个模块独立开发和测试。
这篇文章先介绍一下组件化的开发方法,之前写过一篇文章《iOS高德地图添加自定义瓦片地图》,本篇就记录下把这个功能做成一个Pod组件的过程。
组件改造
前面一篇文章中的地图组件已经基本可以使用了,但是实现方法不方便扩展,所以首先要修改该地图组件。
在头文件中增加添加瓦片地图方法,瓦片地图需要URL构造器,zoom的最大和最小值,还有显示范围
#import <MAMapKit/MAMapKit.h>
NS_ASSUME_NONNULL_BEGIN
// URL 构造器
typedef NSURL *_Nullable(^TileOverlayUrlBuilder)(MATileOverlayPath path);
@interface PPGMapView : MAMapView
- (void)addTileOverLayWithBuilder:(TileOverlayUrlBuilder)builder;
- (void)addTileOverLayWithBuilder:(TileOverlayUrlBuilder)builder minimumZ:(NSInteger)minimumZ maximumZ:(NSInteger)maximumZ;
- (void)addTileOverLayWithBuilder:(TileOverlayUrlBuilder)builder minimumZ:(NSInteger)minimumZ maximumZ:(NSInteger)maximumZ boundingMapRect:(MAMapRect)boundingMapRect;
@end
NS_ASSUME_NONNULL_END
实现文件中增加对应的三个方法
- (void)addTileOverLayWithBuilder:(TileOverlayUrlBuilder)builder {
// 默认最小12,最大20级
[self addTileOverLayWithBuilder:builder minimumZ:12 maximumZ:20 boundingMapRect:MAMapRectWorld];
}
- (void)addTileOverLayWithBuilder:(TileOverlayUrlBuilder)builder minimumZ:(NSInteger)minimumZ maximumZ:(NSInteger)maximumZ {
[self addTileOverLayWithBuilder:builder minimumZ:minimumZ maximumZ:maximumZ boundingMapRect:MAMapRectWorld];
}
- (void)addTileOverLayWithBuilder:(TileOverlayUrlBuilder)builder minimumZ:(NSInteger)minimumZ maximumZ:(NSInteger)maximumZ boundingMapRect:(MAMapRect)boundingMapRect {
// 添加自定义瓦片图层
PPGTileOverlay *overlay = [[PPGTileOverlay alloc] init];
overlay.maximumZ = maximumZ;
overlay.minimumZ = minimumZ;
overlay.boundingMapRect = boundingMapRect;
overlay.builder = builder;
[self addOverlay:overlay];
}
这样改造基本就完成了,在ViewController中也测试一下,也没有问题。
注册Cocoapods
在终端中输入pod trunk register [YOUR_EMAIL] [YOUR_NAME] --verbose
,cocoapods会发送一个验证邮件到你的邮箱中,按提示完成验证后回到终端,输入pod trunk me
,可以看到注册好的信息了 。这部可能需要梯子
创建Pod组件
在终端中进入项目目录,运行下面的命令
pod spec create PPG_TileOverlay_AMap
会生成一个podspec文件,使用文本编辑器打开PPG_TileOverlay_AMap.podspec
文件,修改文件内容,下面对部分文件内容进行解释
Pod::Spec.new do |spec|
# 基本信息
spec.name = "PPG_TileOverlay_AMap"
spec.version = "0.0.1"
spec.summary = "高德地图添加瓦片地图"
# 描述,要比上面的summary多一点内容!
spec.description = <<-DESC
在地图组件中快速添加自定义的瓦片地图
DESC
# 项目介绍主页
spec.homepage = "https://github.com/gaopeng-hz/PPG_TileOverlay_AMap"
# LICENCE文件,可以直接在GitHub上生成
spec.license = { :type => "MIT", :file => "LICENSE" }
# 作者信息
spec.author = { "gaopeng" => "gaopeng62524@126.com" }
# 指定系统和版本
spec.platform = :ios, "7.0"
# 项目代码
spec.source = { :git => "https://github.com/gaopeng-hz/PPG_TileOverlay_AMap.git", :tag => "#{spec.version}" }
# 源文件
spec.source_files = "TileOverlay/PPGMapView.{h,m}"
# 头文件
spec.public_header_files = "TileOverlay/PPGMapView.h"
# 依赖
spec.dependency 'SDWebImage', '~> 4.2'
spec.dependency 'AMap3DMap'
end
编辑完成后需要对spec进行校验,在终端中执行下面的命令:
pod lib lint --use-libraries --allow-warnings
因为本次依赖SDWebImage
和AMap3DMap
,所以需要加上--use-libraries
参数,--allow-warnings
表示允许warning,检查通过后会提示XXX passed validation
。
通过后可以把代码提交到spec中指定的git仓库中,并且打上tag。
git commit -am '提交组件'
git tag 0.0.1 #跟spec中tag一致
git push origin master
git push --tags
推送到Cocoapods远程仓库
pod trunk push PPG_TileOverlay_AMap.podspec --use-libraries --allow-warnings
成功后有提示
推送成功提示
访问上图中的链接已经可以看到组件在cocoapods上的页面。
测试组件
新建一个工程,添加pod
Podfile
target 'TileOverlayDemo' do
# Pods for TileOverlayDemo
pod 'PPG_TileOverlay_AMap'
end
ViewController.h
#import "ViewController.h"
#import <PPGMapView.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
PPGMapView *mapView = [[PPGMapView alloc] initWithFrame:self.view.bounds];
[mapView addTileOverLayWithBuilder:^NSURL * _Nullable(MATileOverlayPath path) {
NSString *urlStr = [NSString stringWithFormat:@"_url_template_"];
return [NSURL URLWithString:urlStr];
}];
[self.view addSubview:mapView];
}
@end
测试成功。这样一个公共的组件就完成了。