iOS組件化 - 基礎

參考資料

一、組件化啓蒙文章html

iOS應用架構談ios

二、經過Cocoapods實現組件化:git

Cocoapods 創建私有庫 - 官方github

Cocoapods 應用第二部分 - 私有庫相關
bash

使用 Cocoapods 建立私有 podspec網絡

給 Pod 添加資源文件
架構

三、組件化相關資料:ide

iOS關於CTMediator組件化實踐的詳解篇組件化

Cocoapods 系列教程
post

相關文章

iOS組件化 - 項目組件化

咱們爲何要對項目進行組件化?

以個人切身經從來說:

一、隨着業務增長,需求迭代。整個項目的文件愈來愈多,Build愈來愈慢,按下 Command + R,而後喝杯卡布奇諾再蹲個坑回來,項目尚未跑完。。。

二、幹外包,啊不,在外包公司作項目。通用的基礎功能代碼,如:菊花、網絡訪問組件、下拉刷新、數據持久化、基礎類的分類。若是不把它們弄成私有庫,那麼咱們只能選擇:


言歸正傳,我對項目進行組件化我幹了兩件事:

  1. 把基礎功能作成私有庫,能夠經過 pod 添加到任何項目;
  2. 把獨立功能模塊作成私有庫,再將該模塊添加到主項目實現模塊分離,這裏解藕解得我欲仙欲死。

一、建立私有Spec Repo

私有庫固然要用私有Spec Repo,固然可使用官方的Repo,但若是隻想添加本身的Pods,那仍是使用私有的Repo把。打開:~/.cocoapods/repos。你會看到一個master文件夾,這個是 Cocoapods 官方的 Spec Repo。

1.一、建立一個私有的Git倉庫來做爲私有的Repo

這裏建立 DYDemoSpecs 倉庫。

1.二、執行repo命令添加私有Repo

# pod repo add [Private Repo Name] [GitHub HTTPS clone URL]
$ pod repo add DYDemoSpecs https://github.com/liyunxin/DYDemoSpecs.git複製代碼

此時若是成功的話,到:~/.cocoapods/repos 目錄能夠看到DYDemoSpecs。


二、建立一個組件庫

2.一、Using Pod Lib Create 建立組件庫

經過官方文檔:Using Pod Lib Create,建立一個DYDemoTools項目。cd到想要建立項目的目錄而後執行:

$ pod lib create DYDemoTools複製代碼

接着在命令行須要你確認一些參數:


根據命令行的輸入會建立不同的工程

2.二、建立DYDemoTools倉庫

這裏建立 DYDemoTools 倉庫,並clone到本地。

把2.1步驟生成的項目的相關文件複製到DYDemoTools倉庫目錄下

這裏你也能夠直接給2.1生成的項目設置遠端倉庫


2.三、podspec文件

podspec是Ruby文件,能夠打開Example的項目工程查看。

這是我在DYDemoTools中使用的podspec文件:

相關字段能夠到 官方文檔 查閱

Pod::Spec.new do |s|
  s.name             = 'DYDemoTools'
  s.version          = '0.0.1'
  s.summary          = 'DYDemoTools.'

  s.description      = <<-DESC
  TODO: Add long description of the pod here.
  DESC

  s.homepage         = 'https://github.com/liyunxin/DYDemoTools'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'liyunxin' => '447674668@qq.com' }
  s.source           = { :git => 'https://github.com/liyunxin/DYDemoTools.git', :tag => s.version.to_s }

  s.platform   = :ios, "10.0"
  s.frameworks = 'UIKit'

  s.source_files = 'DYDemoTools/Classes/**/*'
  
end複製代碼

從 podspec 中,source_files字段的設置能夠知道,該組件的源文件都要放在倉庫中DYDemoTools文件夾中。

2.四、添加類到組件

這裏我添加一個自定義Button到Pod/Classes,而後進入Example文件夾執行 pod update 命令。再次打開Example項目工程能夠看到:

每一次修改了pod或者之後更新了podspec版本都須要從新執行一遍 pod update 命令


使用示例:

在Example工程的ViewController中直接導入 KHBarButton,這裏要先給Main.storyboard添加導航控制器
#import "ViewController.h"
#import "KHBarButton.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.rightBarButtonItem = [[KHBarButton rightBtnWithTitle:@"德瑪西亞" Color:[UIColor blackColor] ClickOption:^{
        NSLog(@"德瑪西亞,永世長存");
    }] getBarItem];
}

@end複製代碼

2.五、添加資源文件(如添加一張照片)

  • 建立 DYDemoToolsAsset.xcassets 用來存放 DYDemoTools 組件的圖片
  • 在 Pod 中建立一個Base文件夾,把DYDemoToolsAsset.xcassets放入其中
  • 在 podspec 添加相關代碼

Pod::Spec.new do |s|
  s.name             = 'DYDemoTools'
  s.version          = '0.0.1'
  s.summary          = 'DYDemoTools.'

  s.description      = <<-DESC
  TODO: Add long description of the pod here.
  DESC

  s.homepage         = 'https://github.com/liyunxin/DYDemoTools'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'liyunxin' => '447674668@qq.com' }
  s.source           = { :git => 'https://github.com/liyunxin/DYDemoTools.git', :tag => s.version.to_s }

  s.platform   = :ios, "10.0"
  s.frameworks = 'UIKit'

  s.source_files = 'DYDemoTools/**/*'

  s.resource_bundles = {
    'DYDemoTools' => ['DYDemoTools/Base/*.xcassets']
  }
end複製代碼

  • 在 DYDemoToolsAsset 中添加任意一張圖片
  • 在 Pod 中建立一個Tools文件夾,而後建立並添加 DYDemoYools 類
  • 打開Example文件夾執行 pod update
  • 打開Example工程,可看到以下目錄:


獲取DYDemoToolsAsset中的圖片有不少中方法,這裏採起的方法:

在DYDemoYools中添加一個類方法,專門獲取
DYDemoToolsAsset中的圖片

#import <Foundation/Foundation.h>

@interface DYDemoTools : NSObject

///獲取KHealthTools這個Bundle的圖片
+ (UIImage *)getToolsBundleImage:(NSString *)imageName;

@end

複製代碼

#import "DYDemoTools.h"

@implementation DYDemoTools

///獲取DYDemoTools這個Bundle的圖片
+ (UIImage *)getToolsBundleImage:(NSString *)imageName {
    static NSBundle *bundle;
    if (bundle == nil) {
        bundle = [NSBundle bundleWithPath:[[NSBundle bundleForClass:NSClassFromString(@"DYDemoTools")] pathForResource:@"DYDemoTools" ofType:@"bundle"]];
    }
    
    UIImage *image = [UIImage imageNamed:imageName inBundle:bundle compatibleWithTraitCollection:nil];
    if (image == nil) {
        image = [UIImage imageNamed:imageName];
    }
    
    return image;
}

@end
複製代碼

使用示例:

在Example工程的ViewController中直接導入DYDemoTools

#import "ViewController.h"
#import "KHBarButton.h"
#import "DYDemoTools.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    __weak typeof(self) weakSelf = self;
    self.navigationItem.rightBarButtonItem = [[KHBarButton rightBtnWithTitle:@"德瑪西亞" Color:[UIColor blackColor] ClickOption:^{
        [weakSelf addImageDemo];
    }] getBarItem];
}

- (void)addImageDemo {
    UIImage *img = [DYDemoTools getToolsBundleImage:@"img1"];
    UIImageView *iV = [[UIImageView alloc] initWithFrame:CGRectMake(50, 100, img.size.width, img.size.height)];
    iV.image = img;
    [self.view addSubview:iV];
}

@end複製代碼

效果圖:


2.六、設置subspec

這個未來有大用

在Base裏面添加:DYDemoToolsHeader.h

Pod::Spec.new do |s|
  s.name             = 'DYDemoTools'
  s.version          = '0.0.1'
  s.summary          = 'A short description of DYDemoTools.'

  s.description      = <<-DESC
  TODO: Add long description of the pod here.
  DESC

  s.homepage         = 'https://github.com/liyunxin/DYDemoTools'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'liyunxin' => '447674668@qq.com' }
  s.source           = { :git => 'https://github.com/liyunxin/DYDemoTools.git', :tag => s.version.to_s }

  s.platform   = :ios, "10.0"
  s.frameworks = 'UIKit'
  
  s.subspec '0_Base' do |sb|
    sb.source_files = "DYDemoTools/0_Base/**/*.{h,m}"
    sb.resource_bundles = {
      'DYDemoTools' => ['DYDemoTools/0_Base/*.xcassets']
    }
  end
  
  s.subspec '1_Tools' do |st|
    st.source_files = "DYDemoTools/1_Tools/**/*.{h,m}"
  end
  
  s.subspec '2_View' do |sv|
    sv.source_files = "DYDemoTools/2_View/**/*.{h,m}"
  end
  
end
複製代碼

2.七、向Spec Repo提交podspec

終於來到這裏了,提交以前要驗證 podspec 是否無誤。不然沒辦法提交。而後還要給 git 打上一個 tag,該 tag 要與 podspec 的 version 相同。

#cd到DYDemoTools文件夾,執行下面的命令
pod lib lint --allow-warnings複製代碼

若是出現:DYDemoTools passed validation. 那恭喜我,本地校驗經過:


#cd到DYDemoTools文件夾,執行下面的命令
pod repo push DYDemoSpecs DYDemoTools.podspec --allow-warnings複製代碼

查看:~/.cocoapods/repos/DYDemoSpecs,你會看到新增了一個DYDemoSpecs


到此,第一個組件庫建立完成

三、在項目中使用組件

這裏建立 DYDemo666 倉庫。

建立一個DYDemo666工程。添加podfile文件以下:

use_frameworks!

platform :ios, '10.0'

source 'https://github.com/CocoaPods/Specs.git'  # 官方庫
source 'https://github.com/liyunxin/DYDemoSpecs.git' # 私有庫

target 'DYDemo666' do
  pod 'DYDemoTools'
end複製代碼

執行成功後打開項目:


在 DYDemo666 中的 ViewController 使用組件的東西:

#import "ViewController.h"
#import "DYDemoToolsHeader.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    __weak typeof(self) weakSelf = self;
    self.navigationItem.rightBarButtonItem = [[KHBarButton rightBtnWithTitle:@"哈哈哈" Color:[UIColor blackColor] ClickOption:^{
        [weakSelf addImageDemo];
    }] getBarItem];
}

- (void)addImageDemo {
    UIImage *img = [DYDemoTools getToolsBundleImage:@"img1"];
    UIImageView *iV = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, img.size.width, img.size.height)];
    iV.image = img;
    [self.view addSubview:iV];
}

@end複製代碼

使用效果:


四、對項目進行組件化

接下來的筆記在下一篇文章:iOS組件化 - 項目組件化

相關文章
相關標籤/搜索