陈江川

邮箱:jiangchuanc@gmail.com

iOS组件化之路

目前主流的iOS组件化方案有两种:
1)基于一个Workspace,关联多个Project;
2)CocoaPods私有库。

原理

  1. 基于一个Workspace,关联多个Project。

    1. 创建一个Workspace,把所有的Project添加到里面;
    2. 一个核心的Project,多个副Project;
    3. 副Project都是以静态库的形式创建;
    4. 主Project导入副Project生成的.a文件,就可以使用副Project;
    5. 副Project之间也可以相互依赖。
  2. CocoaPods私有库

    1. 创建CocoaPods私有仓库;
    2. 开发各个组件,完成后上传到CocoaPods私有仓库;
    3. 创建一个Project,生成Podfile,在Podfile文件中关联要依赖的组件;
    4. pod install后就可以使用组件了。

实践

讲真,目前这两个方式我并没有使用到实际的项目中,只是基于这两个思想各自写了Demo。

基于一个Workspace,关联多个Project的实践

创建工程

  1. 打开Xcode,创建一个Workspace:WorkspaceDemo;
  2. 创建一个主Project:KernelProject,并且添加到WorkspaceDemo中:
  3. 创建Project1、Project2

    3.1 选择静态库

    3.2 添加到Worksapce中

  4. 创建完,整个Workspace的结构

关联工程

KernelProject关联Project1、Project2,但Project1和Project2不关联

  1. 在KernelProject中选择‘Build Phases’ -> ‘Link Binary With Libraries’

  2. 在KernelProject设置'Header Search Paths',添加Project1、Project2的相对路径,$(SRCROOT)代表当前项目的路径:

  3. 在KernelProject文件中可以包含头文件了:

KernelProject关联Project1、Project2,但Project1和Project2也有关联

这里假设Project1需要引用Project2的类,其它步骤和上面是一样的,这里只列出多出来的步骤:

  1. 在Project1中选择‘Build Phases’ -> ‘Link Binary With Libraries’

  2. 在Project2中选择‘Build Settings’ -> ‘Header Search Path’

添加CocoaPods支持

  1. 在WorkspaceDemo目录下创建Podfile文件

  2. 按以下格式进行编写

    # 指定Workspace
    workspace 'WorkspaceDemo'
    
    target 'KernelProject' do
      platform :ios, ‘8.0’
      xcodeproj 'KernelProject/KernelProject.xcodeproj'
    end
    
    target 'Project1' do
      platform :ios, ‘8.0’
      xcodeproj 'Project1/Project1.xcodeproj'
      pod 'AFNetworking'
    end
    
    target 'Project2' do
      platform :ios, ‘8.0’
      xcodeproj 'Project2/Project2.xcodeproj'
    end
    
    
  3. 执行:pod install --no-repo-update,完成后目录会多出Pods文件夹

  4. 把Pods添加到WorkspaceDemo中:

  5. 最终的目录结构

  6. 这时候编译KernelProject,会报错,大概意思是重复引用的:

    在KernelProject工程中删掉libProject2.a,因为在Project1中已经包含了Project2静态库

基于Workspace组件化开发Demo

基于CocoaPods私有库的实践

创建CocoaPods库

前提:电脑已经安装CocoaPods。

这个教程之前已经写过CocoaPods私有库

解藕

解藕主要分两方面:1.界面解藕;2.组件解藕。

界面解藕

所谓界面解藕就是降低ViewController之间的耦合,目前我使用的好似Routable,关于使用Routable一些心得见使用Routable后的思考

组件解藕

目前我在使用的是BeeHive框架。

View层

  1. MVC:对于Model,个人偏重于胖Model;
  2. MVVM + RAC:对于RAC来说,学习成本可能会高一点。

网络层

使用猿题库的YTKNetwork,然后结合Casa的iOS应用架构谈 网络层设计方案,对YTKNetwork进行了一点修改基于YTKNetwork的扩充

数据持久层

目前正在学习Core Data,感觉大家对Core Data误解有点深。

« iOS项目开发中组件化的应用 Xcode8如何使用插件 »