iOS 从0到1搭建高可用App框架
最近更新——iOS 从0到1搭建高可用App框架(二)
1. 如何运用“高内聚,低耦合”的架构思想设计应用
2. 如何分解ViewController压力
3. 如何正确选择第三方框架
-------------------------------------------2017-07-05-----------------------------------------------------
最近在搭建新项目的iOS框架,一直在思考如何才能搭建出高可用App框架,能否避免后期因为代码质量问题的重构。以前接手过许多“烂代码”,架构松散,底层混乱,缺少规范,导致团队开发时代码风格迥异,清晰的项目结构和良好的代码规范是保证产品质量的关键,下面分享一下我的架构思路。
架构图:

架构原则:易读性、易维护性、易扩展性。
思考
做好一件事,花在思考上的时间应该多于执行。
首先根据产品需求和设计图,脑中先建立一个产品架构:
1. 产品的定位
社交、媒体、游戏、运动、音视频、电商……要搞清楚你要做一个什么类型的App,不同类型的产品,技术选型也有所不同,在架构设计的前期考虑的提前量也不同。设计框架的初衷是希望他足够健壮,能够满足未来业务层的需求,不需要每个人开发时再去添加新的底层代码,从开始就解决了未来代码混乱的源头!
2. 基础框架选择
根据当前产品的需求以及未来可能有的需求(我怎么知道未来会有什么需求?可以参照竞品,可以发挥想象,如果产品说:“我们要做IM文字聊天,只做文字!不做音视频,以后都不做!” 类似这样的承诺,我劝你可千万别信。这时候你就需要考虑到后面会有语音+视频聊天、图片传输等方面的问题,在设计的时候不要偷懒,预留一定空间,当某天产品反悔的时候,你可以微微一笑,从容应对。
一把拉回话题,接着说技术选型,通常我会选择一些当下比较热门、好用的第三方框架,例如:YYKit ,YYKit 是一组庞大、功能丰富的 iOS 组件,包含Model解析、图片加载、缓存等基础服务,都是基于Category设计的,使用方便且性能高于一些老的框架,用过的都说好。
网络框架我建议看一下YTNetwork,面向对象的思想设计的网络框架,功能强大,就是使用起来跟之前传统的直接用不一样,而是把每个请求当做一个对象来看,具体可以GitHub搜索学习一下。
其他框架的选择可以根据项目需求,去GitHub上搜索,星星多的每个都看一下,会给你增加一些思路。
程序猿长得可以保守,思想一定不能太保守!
一、搭建目录结构

如上图,我是这样搭建App目录结构的,从下到上,层次清晰明了,另外我是使用Pods管理第三方框架,有些人问我为什么用Pods,他比自己丢代码进去有什么好?我只能说,很方便自己体会,别人说好的东西,最好试一试,太保守不是好习惯,将第三方框架进行二次封装,供给顶层使用,尽可能减少各模块之间的耦合度。
二、封装基础类

1. AppDelegate是应用的代理,应用级的事件都委托它处理,包含启动退出、推送等事件,以及IM、支付等第三方的回调,这使得AppDelegate内代码庞大,错综复杂,十分不利于阅读和维护,因此我新增了一个AppDelegate+AppService类别,用来处理生命周期之外的业务,AppDelegate作为事件入口,具体实现直接调用类别里的方法。

2. Modules包含了应用内的功能模块,根据底部Tab栏划分并关联实体文件夹(默认是虚拟的要手动建立实体文件夹拖进来),每个模块内使用的是MVC模式,有人会问为什么多了Resource和Service文件夹,MVC是一种设计思想,并非死套路就仨文件夹,根据实际需求适当增加,在这我选择在Service封装数据请求,VC里调用拿数据即可,至于Resource为什么在这,我认为当功能模块层级较多时,每个大功能模块都对应许多资源,对应到模块内用起来方便,当然也可以放到最外层的Resource文件夹里,建立对应的模块名称,在这儿我是选择把公共的放到最外层Resource里,功能相关的放到模块里的Resource文件夹内。

3. Manager的定义是全局基础服务,通常使用类方法或者单例来实现,主要包含对应用、用户的管理和服务,例如网络状态监听,广告页应用介绍页等;用户快速登录退出操作以及登录状态的获取等。

4. Utils文件夹内主要包含全局通用工具,来源于对三方框架的二次封装,或是自己写的工具类。在这个项目里,我封装了带AES加密网络请求工具,全局Toast提示,广告页等。

5. Base文件夹用来存放项目的基类,基类作用包含一些定制化的内容,例如页面样式,空数据页面等,使用基类来实现,可以统一控制,利于维护,减少冗余,也为更清晰。

6. 第三方文件夹放一些第三方的类库和对第三方封装,比如第三方登录、支付、IM等,现在项目我还没有添加第三方框架。
7.全局宏顾名思义是定义了一些全局通用宏。我这里定义了四个:
UtilsMacros定义的是一些工具宏,比如获取屏幕宽高,系统版本,数据类型验证等;
URLMacros定义服务器接口地址以及环境开关;
FontAndColorMacros定义全局用的色值、字体大小,这里建议跟设计师共同维护一个设计规范,例如:定义一个主色调宏 MainColor,色值是 0x333333,我们全局使用MainColor宏作为背景颜色,当某天App改版,色值改变,我们只需要去更改 0x333333即可,其他代码不需要动,同时也能一定程度约束设计师,不要随便增加一种颜色,非常接近的颜色应当使用一个。如果设计师不愿意维护这个规范,你可以尝试打一架,打不过的话,就只能自己维护了。
ThirdMacros 包含第三方框架相关的定义,例如keySecret等。

8. 资源文件,上面说到过,这里我是存放了全局的一些资源文件,功能模块的我放到了模块内的Resource文件夹内,个人喜好。

9. CocoaPods是iOS项目的依赖管理工具,开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省设置和第三方开源库的时间。
效果图:

本文只是阐述本人近期架构的出发点和整体思路,代码的具体实现没有细说,感兴趣的可以下载源码阅读
欢迎各路大神提出更好的架构思想大家一起学习交流
下面对你也许有帮助:
iOS 团队编码规范 —— 团队开发需要共同遵守的代码规范
代码注释,教你用快捷键+代码块实现快速注释 —— 让注释不再是负担,快捷键帮你解决
通用工具类宏定义 —— 进一步提升编码效率
以上属于臭码农原创,若有雷同属巧合,如有错误望指正,转载请标明来源和作者。