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,可以看到注册好的信息了 。这部可能需要梯子

cocoapods注册成功

创建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

因为本次依赖SDWebImageAMap3DMap,所以需要加上--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

测试成功。这样一个公共的组件就完成了。

代码仓库地址:https://github.com/gaopeng-hz/PPG_TileOverlay_AMap

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

推荐阅读更多精彩内容

  • 最近在学习vue.js的时候发现,vue的组件化的思想对于编写代码是一个非常有用的事情。 首先为什么需要组件化? ...
    拂晓的云阅读 7,131评论 6 23
  • 组件化简介 想要做组件化的前提当然得知道什么是组件化。顾名思义,组件化就是将APP拆分成各个组件(或者说模块也行)...
    Gui晨曦遇晓阅读 9,413评论 9 46
  • iOS组件化开发1 · 什么是组件化 组件化开发2 · 组件开发必备技能 这篇文章的主要内容list1、学会使用g...
    Biharry阅读 8,862评论 2 114
  • 组件化这个东西已经流行很久了,很多大公司已经有一套十分完善的组件化体系,有的公司随着规模的不断扩大也开始在进行组件...
    MichealXXX阅读 1,261评论 0 5
  • 什么是组件化开发,我就不详细介绍了,网上可以找到很多资料.IOS-组件化架构漫谈这篇文章就比较全面的介绍了组件化开...
    predecessor阅读 726评论 0 5