iOS-本地化组件化的实践

前言

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

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

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

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

技术思路

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

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

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

Demo实践

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

Github-ModularizationDemo

以下是具体的实践过程:

创建 workspace

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

iOS-本地化组件化的实践_第1张图片
workspace.png
创建 Project
  • 首页
  • 我的
  • 登录
  • 身体信息组件
  • 公共组件

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

command + shift + N 创建 Project

注意要放在 Records 这个 workspace 中

iOS-本地化组件化的实践_第2张图片
add_project.png

创建完成如图

iOS-本地化组件化的实践_第3张图片
structure.png

构造组件

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

iOS-本地化组件化的实践_第4张图片
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' => '[email protected]' }
    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 
    #import 
    #endif

    EOS
end

CTMediator

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

iOS-本地化组件化的实践_第5张图片
CTMediator.png

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

组件的调用

构造 Podfile 文件

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

iOS-本地化组件化的实践_第6张图片
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 看到加载的组件

iOS-本地化组件化的实践_第7张图片
Pods.png

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

iOS-本地化组件化的实践_第8张图片
Record.png

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

#import 

- (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。

你可能感兴趣的:(iOS-本地化组件化的实践)