美文网首页
iOS 组件化

iOS 组件化

作者: p_peng | 来源:发表于2019-05-15 10:41 被阅读0次

    组件化 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

    相关文章

      网友评论

          本文标题:iOS 组件化

          本文链接:https://www.haomeiwen.com/subject/cotraqtx.html