搜索
您的当前位置:首页正文

iOS组件化实践之路

来源:二三娱乐

iOS组件化实践之路

前言

随着应用需求逐步迭代,随着应用逐步庞大,开发人员越来越多和繁杂。为了更好的管理项目,项目组件化逐渐走入了iOS开发者视野,通过组件化方式,理想状态是:我们能使模块之间完全解耦,让独立模块和独立功能能单独运行,这样做有哪些好处?

  1. 模块完全独立和解耦,方便不同团队之间进行协作
  2. 庞大的工程拆分为了多个子工程,编译和运行时间大大缩短
  3. 方便实现模块的版本控制
  4. 方便实现动态配置化,由于模块之间的独立性,在业务逐渐丰富情况下,我们可以通过配置中心,对APP进行配置,控制模块的动态的添加和移除。
  5. ……

当前主流方案

组件化实践

业务划分

看了许多文章,我们当然跃跃欲试,下面我便以一个简化的Demo为例,实践组件化。我们以一个简单的淘宝电商Demo作为业务场景,这种最基础的电商场景大家都非常熟悉,我们对Demo进行初略的模块划分:

  • BaseEnv模块:登录,网关,数据库,JSBridge,基础Catagory,Util等
  • Index业务模块:电商首页模块
  • Search业务模块:电商搜索模块
  • ProductDetail业务模块: 商品详情模块* Cart业务模块:购物车模块
  • ……

大致的结构图如下:

整体架构图

工程搭建

我们可以利用CocoaPods私有库的方式,对不同模块进行集成。

初始化模块

➜ pod lib create ZFIndex

通过这条命令,能生成模块基础代码和.podspec文件,我们需要关心的如下几点!

Module文件目录
  • Example:子工程运行工程,以后的模块开发调试都在此进行,而不是在主工程
  • ZFIndex: 该模块核心逻辑代码
  • podspec:该模块作为spec提供给外部使用的配置文件

下面看下podspec文件内容

#
# Be sure to run `pod lib lint ZFIndex.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
#

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

# This description is used to generate tags and improve search results.
#   * Think: What does it do? Why did you write it? What is the focus?
#   * Try to keep it short, snappy and to the point.
#   * Write the description between the DESC delimiters below.
#   * Finally, don't worry about the indent, CocoaPods strips it!

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

  s.homepage         = 
  # s.screenshots     =  
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'zf' =>  }
  s.source           = { :git =>  :tag => s.version.to_s }
  # s.social_media_url = 

  s.ios.deployment_target = '8.0'

  s.source_files = 'ZFIndex/Classes/**/*'

  # s.resource_bundles = {
  #   'ZFIndex' => ['ZFIndex/Assets/*.png']
  # }

  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
  # s.dependency 'AFNetworking', '~> 2.3'
end

这部分代码是ruby写的,具体实现方案后面会进行分析,我们先明白几个关键点:

  • name: pod名称
  • version: pod版本号
  • source: pod对应的git地址
  • source_files: pod对应的源码文件
  • resource_bundles: pod工程对应的资源文件
  • frameworks: pod以framework方式提供需要
  • public_header_files: pod以framework方式提供需要

主工程引入

主工程通过Podfile的方式引入,因为现在模块是存在本地的,因此我们使用本地相对路径的方式引入:
Podfile文件:

require 'cocoapods-multithread-installpod'

platform :ios, '8.0'

target 'ZFModuleDemo' do
    pod  'ZFIndex', :path=> '../ZFIndex/'
end

最终工程目录如下图:


工程目录

这样最简易的组件化工程环境已经搭建好了,我们可以开始进行模块开发。

问题

Top