没有合适的资源?快使用搜索试试~ 我知道了~
• 代码提交更规范,质量提高。体现在测试人员反馈的 bug 明显减少。 • 编译加快。在都是源码的情况下:原 App 需要 150s 左右整个编译完毕,然后开发人 员才可以开始调试。而现在组件化之后,某个业务组件只需要 10s~20s 左右。在依赖 二进制化组件的情况下,业务组件编译速度一般低于 10s。 • 分工更为明确,从而提升开发效率。 • 灵活,耦合低。 • 结合 MVVM。非常细致的单元测试,提高代码质量,保证 App 稳定性。体现在测试人 员反馈的 bug 明显减少。 • 回滚更方便。我们经常会发生业务或者 UI 变回之前版本的情况,以前我们都是 checkout 出之前的代码。而现在组件化了之后,我们只需要使用旧版本的业务组件 Pod 库,或者在旧版本的基础上再发一个 Pod 库。 • 新人更容易上手。
资源推荐
资源详情
资源评论
iOS App 组件化开发实践
| 作者
曹俊
发布于 2016 年 9 月 26 日
前因
其实我们这个 7 人 iOS 开发团队并不适合组件化开发。原因是因为性价比低,需要花很多
时间和经历去做这件事,带来的收益并不能彻底改变什么。但是因为有 2~3 个星期的空
档期,并不是很忙;另外是可以用在一个全新的 App 上。所以决定想尝试下组件化开发。
所谓尝试也就是说:去尝试解决组件化开发当中的一些问题。如果能解决,并且有比较好
的解决方案,那就继续下去,否则就放弃。
背景
脱离实际情况去谈方案的选型是不合理的。
所以先简单介绍下背景:我们是一家纳斯达克交易所上市的科技企业。我们公司还有好几
款 App,由不同的几个团队去维护,我们是其中之一。我们这个团队是一个 7 人的 iOS 开
发小团队。作者本人是小组长。
之前的 App 已经使用了模块化(CocoaPods)开发,并且已经使用了二进制化方案。App
已经在使用自动化集成。
虽然要开发一个新 App,但是很多业务和之前的 App 是一样的或者相似的。
为什么要写这篇博客?
想把整个过程记录下来,方便以后回顾。
我们的思路和解决方案不一定是对的或者是最好的。所以希望大家看了这篇博客之后,能
给我们提供很多建议和别的解决方案,让我们可以优化使得这个组件化开发的方案能变得
更加好。
技术栈
• gitlab
• gitlab-runner
• CocoaPods
• CocoaPods-Packager
• fir
• 二进制化
• fastlane
• deploymate
• oclint
• Kiwi
成果
使用组件化开发 App 之后:
• 代码提交更规范,质量提高。体现在测试人员反馈的 bug 明显减少。
• 编译加快。在都是源码的情况下:原 App 需要 150s 左右整个编译完毕,然后开发人
员才可以开始调试。而现在组件化之后,某个业务组件只需要 10s~20s 左右。在依赖
二进制化组件的情况下,业务组件编译速度一般低于 10s。
• 分工更为明确,从而提升开发效率。
• 灵活,耦合低。
• 结合 MVVM。非常细致的单元测试,提高代码质量,保证 App 稳定性。体现在测试人
员反馈的 bug 明显减少。
• 回滚更方便。我们经常会发生业务或者 UI 变回之前版本的情况,以前我们都是
checkout 出之前的代码。而现在组件化了之后,我们只需要使用旧版本的业务组件
Pod 库,或者在旧版本的基础上再发一个 Pod 库。
• 新人更容易上手。
对于我来说:
• 更加容易地把控代码质量。
• 更加容易地知道小组成员做了些什么。
• 更加容易地分配工作。
• 更加容易地安排新成员。
解耦
我们的想法是这样的,就算最后做不成组件化开发,把这些应该重用的代码抽出来做成
Pod 库也没有什么影响。所以优先做了这一步。
哪些东西需要抽成 Pod 库?
我们之前的 App 已经使用了模块化(CocoaPods 化)开发。我们已经把会在 App 之间重
用的 Util、Category、网络层和本地存储等等这些东西抽成了 Pod 库。还有些一些和业务
相关的,比如 YTXChart,YTXChartSocket;这些也是在各个 App 之间重用的。
所以得出一个很简单的结论:要在 App 之间共享的代码就应该抽成 Pod 库,把它们作为
一个个组件。
我们去仔细查看了原 App 代码,发现很多东西都需要重用而我们却没有把它们组件化。
为什么没有把这些代码组件化?
因为当时没想好怎么解耦,举个例子。
有一个类叫做 YTXAnalytics。是依赖 UMengAnalytics 来做统计的。 它的耦合是在于一个
方法。这个方法是用来收集信息的。它依赖了 User,还依赖了 currentServerId 这个东
西。
+ (NSDictionary*)collectEventInfo:(NSString*)event
withData:(NSDictionary*)data
{
.......
return @{
@"event" : event,
@"eventType" : @"event",
@"time" : [[[NSDate date] timeIntervalSince1970InMillionSecond]
stringValue],
@"os" : device.systemName,
@"osVersion" : device.systemVersion,
@"device" : device.model,
@"screen" : screenStr,
@"network" : [YTXAnalytics networkType],
@"appVersion" : [AppInfo appVersion],
@"channel" : [AppInfo marketId],
@"deviceId" : [ASIdentifierManager
sharedManager].advertisingIdentifier.UUIDString,
@"username" : objectOrNull([YTXUserManager
sharedManager].currentUser.username),
@"userType" : objectOrNull([[YTXUserManager
sharedManager].currentUser.userType stringValue]),
@"company" : [[ServiceProvider
sharedServiceProvider].currentServerId stringValue],
@"ip" : objectOrNull([SSNetworkInfo currentIPAddress]),
@"data" : jsonStr
};
}
解决方案是,搞了一个 block,把获取这些信息的责任丢出来。
[YTXAnalytics sharedAnalytics].analyticsDataBlock = ^ NSDictionary
*() {
return @{
@"appVersion" : objectOrNull([PBBasicProviderModule
appVersion]),
@"channel" : objectOrNull([PBBasicProviderModule
marketId]),
@"username" : objectOrNull([PBUserManager
shared].currentUser.username),
@"userType" : objectOrNull([PBUserManager
shared].currentUser.userType),
@"company" : objectOrNull([PBUserManager
shared].currentUser.serverId),
@"ip" : objectOrNull([SSNetworkInfo currentIPAddress])
};
};
我们的耦合大多数都是这种。解决方案都是弄了一个 block,把获取信息的职责丢出来到
外面。
我们解耦的方式就是以下几种:
1. 把它依赖的代码先做成一个 Pod 库,然后转而依赖 Pod 库。有点像是“依赖下沉”。
2. 使用 category 的方式把依赖改成组合的方式。
3. 使用一个 block 或 delegate(协议)把这部分职责丢出去。
4. 直接 copy 代码。copy 代码这个事情看起来很不优雅,但是它的好处就是快。对于一些
不重要的工具方法,也可以直接 copy 到内部来用。
初始化
AppDelegate 充斥着各种初始化。 比如我们自己的代码。已经只是截取了部分!
[self setupScreenShowManager];
//event start
[YTXAnalytics createYtxanalyticsTable];
[YTXAnalytics start];
[YTXAnalytics page:APP_OPEN];
[YTXAnalytics sharedAnalytics].analyticsDataBlock = ^ NSDictionary
*() {
剩余20页未读,继续阅读
资源评论
odreamboy
- 粉丝: 4
- 资源: 26
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 新年倒计时网页基础教程
- Python编程初学者快速入门基础教程
- 新年倒计时编程基础教程
- 峰会报告自动化处理基础教程
- UE4UE5游戏开发基础教程:从零开始构建你的世界
- DataStructure-拓扑排序
- Front-end-learning-to-organize-notes-新年主题资源
- QPython Plus-Python资源
- baidulite-新年主题资源
- CnOCR-Python资源
- Golang_Puzzlers-新年主题资源
- Python开源扫雷游戏PyMine-Python资源
- Golang_Puzzlers-新年主题资源
- pyporter-Python资源
- Golang_Puzzlers-新年主题资源
- mulan-rework-Python资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功