iOS-本地化组件化的实践

2020-04-28  本文已影响0人  李丘

前言

业界已经有许多技术文章进行了组件化的指导了,这里就不再赘述。

本文主要讲的是小型团队和小型项目对于「本地组件化」的实践。

为什么要提出组件化本地化的概念呢?对于小型项目和小型团队来说,可能自身的项目不需要用到组件化,但是又想学习和利用组件化的技术,组件化的本地化恰好可以满足这个需求。

那么何为本地化的组件化呢?对于常规的组件化来说,每一个模块或者说组件都需要创建为一个远端的组件库,别的模块从远端加载这个组件来使用,这样就需要管理非常多的库。而本地化的组件化只需要创建一个远端的代码库,存放所有的代码,进行版本管理,跟平常的代码管理一样,所有的组件也是放在这个库中,无需创建多个组件库,所以叫做本地化的组件化。

技术思路

本地化的组件化的技术思路是这样的,项目使用 workspace 来管理所有的 Project,其中的一个 Project 为主项目,其他的为不同的组件,新增组件就在这个 workspace 中新建一个 Project

运行主项目就选用主项目 Project,运行单一组件就选择这个组件 Project 进行运行。

而跨模块的通信使用的是基于反射的远程接口调用封装,基于 CTMediator 开源库。

Demo实践

比如现在要开发一款记录类型的APP,可以记录身体信息,比如身高体重等,基本的业务逻辑是,先进行登录,然后进入主功能界面,提供首页记录功能和我的页面两个 Tab。

Github-ModularizationDemo

以下是具体的实践过程:

创建 workspace

如图方式创建一个名为 Records.xcworkspace 的 workspace

workspace.png
创建 Project

按照功能,划分为这几个组件,分别创建4个 project,其中首页和我的放在主 project中,身体信息、登录和公共组件为单一组件,公共组件放一下功能分类,公共类,宏定义,后台接口文档之类的。

command + shift + N 创建 Project

注意要放在 Records 这个 workspace 中

add_project.png

创建完成如图

structure.png

构造组件

举个例子,先完成登录组件,把项目切换到 登录

login.png

完成登录的基本业务逻辑,运行没有错误之后,进行组件化的工作

podspec 文件

在终端创建 podspec 文件

pod spec create 文件名

使用这种方法创建的 podspec 文件会带有大量的注释
touch xx.podspec

使用这种方法会创建出一个空白的 podspec 文件

我们创建跟组件同名的 Login.podspec 文件, 详细语法参考 Podspec语法参考

Pod::Spec.new do |s|
    s.name             = 'Login'
    s.version          = '0.0.1'
    s.summary          = '登录组件'

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

    s.homepage         = 'https://gitee.com/xxx'
    # s.license          = { :type => 'MIT', :file => 'LICENSE' }
    s.author           = { 'xxx' => 'xxxxxxxxx@qq.com' }
    s.source           = { :git => 'https://gitee.com/xxx/Login.git', :tag => s.version.to_s }

    s.ios.deployment_target = '9.0'
    
    s.source_files = 'Login/Login/*.{h,m}'

    s.subspec 'Controller' do |ss|
        ss.source_files = 'Login/Login/Controller/*.{h,m}'
    end

    s.subspec 'Router' do |ss|
        ss.source_files = 'Login/Login/Router/*.{h,m}'
    end

    s.subspec 'View' do |ss|
        ss.source_files = 'Login/Login/View/*.{h,m}'
    end

    s.dependency 'CTMediator'

    s.prefix_header_contents = <<-EOS

    #ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #endif

    EOS
end

CTMediator

这是其他组件调用本组件的入口,通过创建 CTMediator 的分类,获取该组件入口控制器,比如当前登录组件就是通过 CTMediator+Login 分类中的方法获取登录控制器。

CTMediator.png

至此,登录组件已经完成,按照上诉步骤,完成其他组件的构建

组件的调用

构造 Podfile 文件

在 workspace 的根目录下创建 Podfile 文件,并完成构建

Podfile.png
source 'https://github.com/CocoaPods/Specs.git'

# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'

workspace 'Records.xcworkspace'

target 'Record' do

  project 'Record/Record.xcodeproj'
  
  pod 'CTMediator'
  
  #调用登录组件
  pod 'Login', :path => '../Record/Login/'

  inhibit_all_warnings!
  
end

#登录组件
target 'Login' do

  project 'Login/Login.xcodeproj'

  inhibit_all_warnings!

end

在终端使用以下命令完成本地组件的加载

pod update --no-repo-update

加载完成后,可以在 Pods 中的 Development Pods 看到加载的组件

Pods.png

切换到主工程 Record,进行登录组件的调用

Record.png

在需要用到组件的地方,导入组件中的CTMediator分类文件(CTMediator+Login.h),调用分类方法,获取控制器,进行控制器的使用跳转,demo 是在 AppDelegate 中调用

#import <Login/CTMediator+Login.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    
    UIViewController *loginVc = [[CTMediator sharedInstance] loginVc];
    
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:loginVc];
    
    self.window.rootViewController = nav;
    
    [self.window makeKeyAndVisible];
    
    return YES;
}

至此,本地化组件化的基本实践流程已完成,具体请参考Demo。

上一篇 下一篇

猜你喜欢

热点阅读