原文翻译自:Using CocoaPods to Modularize a Big iOS App

// http://blog.csdn.net/rigel_xu/article/details/54693849  (17年更新总结)

为你的移动应用选择正确的架构是一件相当大的事情,这会对你的工作流程造成影响,陷入面对的问题,可能是一笔巨大财富也可能是一个巨大负担。

HubSpot的是一个全功能的app。他是一个分析的app,也是一个设计媒体的app,还是一个邮件app,并且是一个联系人管理的app(可能还有更多地惊喜),这些功能集合在一个app中。去年夏天,当我们开始构建这个相当复杂的app时,我们知道必须有一个可以容易扩展它的架构。

实际上,我们把每个子app当做一个完全完整地独立的应用程序,然后使用CocoaPods将它们集成到主应用程序中。

截图中,你可以看到各个子程序的源程序,仪表盘,社交媒体,实际上既是一个独立的iPhone应用程序,也可以纳入主要的应用程序的菜单中选择一个应用程序。

p1

这会给我们代理一些巨大的好处:

  • 最关键的是,我们很容易就能保证每个子应用程序的主分支是准备好发布,并可以推送一个子应用程序的特定版本。
  • 我们在编译上花费多一些时间,而减少了较多合并的时间。每个独立app的沙盒可以很容易的在子应用程序内循环,花最少的时间与其他应用程序进行集成。如果你在一个以上的iOS团队工作过,你毫无疑问已经经历过.xcodeproj合并时的痛苦。虽然他们可以解决,但这个痛苦地步骤我们只想对他敬而远之。
  • 我们能够在必要时单独部署每个应用程序,这样我们在一个独立的app可用性测试上将会是惊人的。我们可以更早地将我们的app在合成之前提交给测试者,例如导航功能实现之前,这样我们可以得到更高质量,和更有针对性的反馈。
  • 由于子应用程序之间的用户流只是基于URL路径(后面会详细解释)完成的,这意味着路径可以内置或者文档化,而不是从一堆UIViewController以搜索正确的方式来实例化一个特定的视图,当然必须要事先定义好路径。建立类似演练教程或者新的推送通知时,这是非常有用的。

这种架构在一个两人以上的团队建立多方面的iOSapp时,能节省出巨大的时间。

从网页学习

这种将移动端app分割成独立app的灵感来自于我们在HubSpot网页端架构的成功。

HubSpot网页端架构是高速发展和可扩展的。正如我同事所写,我们使用各种工具盒技术,让我们在一天内共同部署300次。这一点至关重要,当HubSpot的产品套件有几个不同的松耦合应用组成:分析,社交媒体,电子邮件,博客和报告工具。

在web上,我们可以编译,测试和发布HubSpotapp独立的一小部分——包括后台API和用Java编写的任务,前端CoffeeScript工程,Python工程。为什么移动端不也这么做?

CocoaPods:用起来!

CocoaPods是iOS中出色的依赖管理解决方案,是一个把所有东西聚合的关键工具。

一个多应用程序架构可能对你的使用的案例过度使用,但CocoaPods绝对不会——尽管你只是生成一小撮使用案例,视图组件或者网络的第三方库——花费几分钟来设置它是完全值得你去投入的。Rubygem类似的语法在app中整合开源组件中变得几乎无缝。

核心库和共享资源,如登录,样式类,API/认证持久性和访问可以构建成带Kiwi测试和podspec文件的独立工程。

我们将他们发布在私有CocoaPods仓库中,然后在实际完全编译的应用中包含他们。然而,我们进一步把它们建立成各个子app——所有的社交媒体,电子邮件,资源,使用样例——分成一个单独的podspec,然后使用CocoaPods将它们编译到一个app中。

这意味着,我们可以在内部发行单一功能的测试版本,并且可以在一个单一的应用程序进行快速的变更而无需担心破坏其他工作在不相关的子app开发者的编译。

我们最终完app的Podfile如下所示:

platform :ios, '6.0'# networking, slider navigation, routing
pod 'AFNetworking', '~> 1.2.1' pod 'ViewDeck', '~> 2.2.11' pod 'JLRoutes', '~> 1.2' # sub-apps, pulling from the head of each repo for development. alternately, we can pin it to a release version like we do the other pods pod 'HSAPIClient', :head pod 'HSCommonResources', :head pod 'HSMarketingGraderApp', :head pod 'HSContactsApp', :head pod 'HSDashboardApp', :head pod 'HSLoginApp', :head pod 'HSSocialApp', :head pod 'HSSourcesApp', :head pod 'HSSettingsApp', :head pod 'HSSocialReach', :head pod 'HSEmailApp', :head

把它粘在一起

细心地读者会注意到我们使用了一些在主app中粘合IIViewDeckJLRoutes两个子app具有关键作用的开源工具。

做到这点我们就可以不需要在基础app的不同菜单项提供信息,并且每个子app的路径都可控。每个子app提供了一个实现了一些HSBaseApp方法的协议类。

HSBaseApp.h文件如下:

@protocol HSBaseApp <NSObject>
+ (UINavigationController *)baseNavigationController; + (NSArray *)menuItems; + (NSArray *)routesToRegister; @end

实现的例子HSSocial.m如下:

+ (UINavigationController *)baseNavigationController {return [[HSNavigationController alloc] initWithRootViewController:[[HSSocialViewController alloc] initWithNibName:@"HSSocialViewController" bundle:nil]];
}+ (NSArray *)menuItems { HSMenuItem *calendarMenuItem = [[HSMenuItem alloc] initWithTitle:@"Publishing" icon:@"\\" launchHubSpotApp:[HSSocial class]]; calendarMenuItem.sectionTitle = @"Social"; return @[calendarMenuItem]; } + (NSArray *)routesToRegister { HSRoute *newItemRoute = [HSRoute routeWithUrl:@"social/new" andAction:^BOOL(id<HSRoutingDelegate> routingDelegate, NSString *url, NSDictionary *parameters) { // handle route, usually by suppying a UIViewController to the routingDelegate }]; NSArray *routes = @[newItemRoute]; // could be more routes here too return routes; }

我们使用路径来处理传入的推送通知,然后我们使用相同的方案将主app和子app进行链接——例如,当我们从数据源或社交媒体返回数据。

HSRoutingDelegate有一点点神奇的是它能绕过当前活动的UINavigationController,然后我们能够在顶部推出或者创建一个基于上下文的模态视图跳转,除此之外,一个简单地JLRoutes基于block的语法也可以达到同样地目的。

我们还能做什么?

从长远来看,我们希望扩大我们过去简单一些共享库的Kiwi测试或在KIF测试中编译,这样每个子app的版本传递KiwiKIF测试是建立在一个持续集成的设置中,我们可以选择已知每个很好的版本,发行主程序的每个版本。

你在多人协作中是如何组织大型的iOSapp的呢?有没有更好的方法?我们很乐意听到您的声音!

转载于:https://www.cnblogs.com/fakeCoder/p/6100842.html

【译】使用 CocoaPods 模块化iOS应用相关推荐

  1. CocoaPods管理iOS的第三方类库

    2019独角兽企业重金招聘Python工程师标准>>> 使用CocoaPods管理iOS的第三方类库 OCT 15TH, 2012 iOS第三方类库的管理是一个很麻烦的事,项目信赖的 ...

  2. 用CocoaPods做iOS程序的依赖管理

    CocoaPods 简介 每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如 Java 语言的 Maven,nodejs 的 npm.随着 iOS 开发者的增多,业界也出现了为 iOS 程序提供 ...

  3. [译] 什么是模块化 CSS?

    原文地址:What is Modular CSS? 原文作者:Scott Vandehey 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:ssshoote ...

  4. CocoaPods管理iOS项目 2018年11月06日

    一.创建Test工程项目 二.打开终端 当前pod版本(1.6.0.beta.2最新版本2018年11月06日)和gem源路径(https://gems.ruby-china.com): 1.cd+当 ...

  5. 【iOS工具】rvm、Ruby环境和CocoaPods安装使用及相关报错问题解决(2016 12 15 更新)...

    〇.前言 在iOS开发中 [CocoaPods](https://github.com/CocoaPods/CocoaPods) 作为库依赖管理工具就是一把利器. 有了 CocoaPods 则无需再通 ...

  6. iOS架构-cocoaPods之自制私有库及管理(17)

    CocoaPods是iOS,Mac下优秀的第三方包管理工具,类似于java的maven,给我们项目管理带来了极大的方便. 个人或公司在开发过程中,会积累很多可以复用的代码包,有些我们不想开源,又想像开 ...

  7. 给iOS库添加Cocoapods支持

    前言: 这个文章是摘自我原来的博客, 接下来我的打算是会在这里发布一些当下流行且实用(Python, RN, iOS 技术等)的技术和小伙伴们互相学习! 先立下一个flag, 起到一个督促作用! 以下 ...

  8. automake生成静态库文件_基于CocoaPods的组件化原理及私有库实践

    轮子为什么会存在 智人能在残酷的进化大战中存活下来,原因之一就是智人懂得将知识沉淀成外物,辅助彼此之间的合作,从而使得整个群体产生了规模效应,即1+1>2的效果. 从一个角度上说,石器时代是基于 ...

  9. iOS开发第三方大全

    UI 下拉刷新 EGOTableViewPullRefresh- 最早的下拉刷新控件. SVPullToRefresh- 下拉刷新控件. MJRefresh- 仅需一行代码就可以为UITableVie ...

最新文章

  1. keepalived lvs
  2. 夏季适合IT程序员的养生小妙招
  3. php禁用cookie后session设置方法分析
  4. 分布式链路追踪框架的基本实现原理
  5. session相关知识的收集于整理
  6. C语言和设计模式(中介者模式)
  7. Ansible(一)工作架构和原理
  8. RIP路由协议基本配置
  9. HarmonyOS 开发App详细步骤
  10. python为何排名越来越前_为什么C#排名和Python相差越来越大?
  11. java 类省_2019 第十届蓝桥杯大赛软件类省赛 Java A组 题解
  12. java定时器quartz
  13. ESP32 开发笔记(四)LVGL控件学习 Roller 滑动选择控件
  14. Panel控件—让你的界面变好看
  15. JAVA中分号用中文还是英文_【英文中有分号(;)吗?怎么用呢?】作业帮
  16. 将Android手机无线连接到Ubuntu实现唱跳Rap
  17. 华北电力计算机类哪个专业好,华北电力大学哪个专业好就业
  18. java求2到100内的素数_java学习日记-基础-列出2~100内的素数
  19. 美式口语发音技巧:《英美发音区别》
  20. 苹果v10模板需要几的php,苹果MACCMSv10源码模板安装常见问题

热门文章

  1. java 正则表达式 逻辑符号
  2. pytorch torchvision.transforms.ToTensor
  3. pytorch Tensor
  4. MySQL create
  5. CentOS7安装后没网络的解决方法
  6. 对象存储 OSS > SDK 示例 > C++ > 数据加密 > 服务器端加密
  7. Redis学习总结(14)——图解redis五种数据结构底层实现(动图版)
  8. 一份阿里员工的Java问题排查工具单
  9. springboot忽略证书_SpringBoot中通过java代码实现忽略SSL证书
  10. 最大化窗口快捷键_计算机快捷键大全(最全篇)