iOS 从0到1搭建高可用App框架

作者: 臭码农 | 来源:发表于2017-05-23 19:52 被阅读12920次

最近更新——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.应用入口

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

2. 功能模块

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

3. 管理模块

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

4.工具类

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

5. 基类

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

6.第三方 & 7.全局宏定义

6. 第三方文件夹放一些第三方的类库和对第三方封装,比如第三方登录、支付、IM等,现在项目我还没有添加第三方框架。

7.全局宏顾名思义是定义了一些全局通用宏。我这里定义了四个:

UtilsMacros定义的是一些工具宏,比如获取屏幕宽高,系统版本,数据类型验证等;

URLMacros定义服务器接口地址以及环境开关;

FontAndColorMacros定义全局用的色值、字体大小,这里建议跟设计师共同维护一个设计规范,例如:定义一个主色调宏 MainColor,色值是 0x333333,我们全局使用MainColor宏作为背景颜色,当某天App改版,色值改变,我们只需要去更改 0x333333即可,其他代码不需要动,同时也能一定程度约束设计师,不要随便增加一种颜色,非常接近的颜色应当使用一个。如果设计师不愿意维护这个规范,你可以尝试打一架,打不过的话,就只能自己维护了。

ThirdMacros 包含第三方框架相关的定义,例如keySecret等。

8. 资源文件

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

9. Pods三方管理

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

效果图:

效果图

本文只是阐述本人近期架构的出发点和整体思路,代码的具体实现没有细说,感兴趣的可以下载源码阅读

欢迎各路大神提出更好的架构思想大家一起学习交流

GitHub下载源码

下面对你也许有帮助:

iOS 团队编码规范 —— 团队开发需要共同遵守的代码规范

代码注释,教你用快捷键+代码块实现快速注释 —— 让注释不再是负担,快捷键帮你解决

通用工具类宏定义 —— 进一步提升编码效率

以上属于臭码农原创,若有雷同属巧合,如有错误望指正,转载请标明来源和作者。

by:臭码农

相关文章

  • 2018-04-26

    iOS 从0到1搭建高可用App框架 https://www.jianshu.com/p/d553096914ff...

  • 架构细节

    寒哥教你学iOS - 经验漫谈 一次立竿见影的启动时间优化 iOS 从0到1搭建高可用App框架 iOS 从0到1...

  • 优秀文章收集

    iOS 开发技术栈与进阶 iOS 从0到1搭建高可用App框架 iOS weak 关键字漫谈 开发者所需要知道的 ...

  • iOS 从0到1搭建高可用App框架

    最近更新——iOS 从0到1搭建高可用App框架(二) 1. 如何运用“高内聚,低耦合”的架构思想设计应用 2. ...

  • iOS 外链技术网站集合

    1. iOS 从0到1搭建高效用App框架

  • iOS 从0到1搭建高可用App框架

    最近在搭建新项目的iOS框架,一直在思考如何才能搭建出高可用App框架,能否避免后期因为代码质量问题的重构。以前接...

  • iOS 从0到1搭建高可用App框架(二)

    前言: 本文是继《iOS 从0到1搭建高可用App框架》之后,通过项目实践以及同行交流思考总结出来的一些新的架构思...

  • iOS 从0到1搭建可用App框架

    搭建app框架需要:创建xcode工程,添加常用第三方框架,添加常用工具类,修改into.plist,添加功能模块...

  • 开发问题笔记(七)

    目录 1.后台返回数值类型,用字符串接收遇到的问题2.iOS 从0到1搭建高可用App框架3.六天完成一个简单AP...

  • 从0到1搭建MVP框架

    相信大多处在Android进阶阶段的朋友都了解过Android框架方面的知识,要开发一款优秀的app,自然少不了优...

网友评论

  • 发小徒:适用于小app还是不错的
  • 小石头JS:写的非常好,学习了
  • 879148a9c706:不知道动到了哪里 导航栏push新界面的时候,导航栏会有20px的白条闪现。求解
    浮生随笔:显示隐藏状态条,或者 屏幕旋转会有这问题
  • 程小曦:ld: truncated fat file. Slice from 7416848 to 9090968 is past end of file with length 9090961 file '/Users/chengxi/Desktop/UniversalProject-master/Pods/YYKit/Vendor/WebP.framework/WebP' for architecture arm64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

    执行过了pod install . 还是不行,YYkit里面这个wepP是啥啊
    臭码农:@程小曦 图像处理库,用于处理webP格式的图片
    程小曦:@臭码农 是啊,报的错误还找不到什么原因。 yykit里面的 webP.framework是干啥的
    臭码农:@程小曦 代码直接拉下来不能跑吗?
  • 明似水:大神,我想请教一下您用的网络框架怎么处理分页请求没有更多数据的情况呢?
    明似水:大神,我用您框架PPNetworkHelper进行请求,http://www.xykj365.com/route/product/boothList,请求错误:Request failed: unacceptable content-type: text/html,我是关闭了加密了的,发现您也设置了text/html,这是什么原因呢?
    明似水:@臭码农 好的,谢谢
    臭码农:兄dei,分页请求是要跟后台制定规则的,后台会给你标识,代表下一页是否还有数据,你拿到标识去改变footer就好了
  • 51f1ca612459:好人一生平安啊
    臭码农:@jiapei__ 我第一眼看成了好人一路走好:persevere:
  • 云飞扬iOS:很好啊,学习了
  • _小川:学习了
  • AliceJordan:mark 很清晰 谢谢啦~
  • han_zero:工程勾选了横屏 然而横屏发现没有适配iPhoneX 造成界面内容缺失 架构还是不错的
  • 李天迪装修美缝经历:学习了,希望可以与你互动~
  • 147085dc8d31:架构图蛮漂亮的,请问是用什么软件画的啊?
  • 冬ge:我用你项目 里的 pp网络请求 输出的是 data流, 而ppnet demo里的 是json输出, 你在哪做了修改吗? 望回复
    冬ge:@臭码农 是我已经注释掉了 在网络请求里面, 不知道你在别处 还写了没 我仔细查过了 也对比了下pp demo 一样的 .
    臭码农:@冬ge 我是加了AES加解密的,把加解密部分去掉试试
  • 小锤子_:要是能发一个具体的项目看看就好了:smile:
    小锤子_:@臭码农 :smile:
    臭码农:@肖申克的小锤子 小锤子同学,本文的目的是阐述架构思想,使用本文思想写出来的框架代码已上传GitHub,我将会一直实践并不断更新完善框架,希望发现问题能与我讨论,共同进步。
  • 跑神的心:东西不错,但是强迫症患者越读越难受,为什么每一段介绍后面都有一个“只为更清晰”,这样重复感觉好烦啊,都没有读下去的欲望了
    臭码农:@跑神的心 说到心坎里,我也有强迫症,所以我现在决定删掉他
  • 浮桥小麦:向您学习,支持分享更多实际开发经验。。。
    臭码农:@浮桥小麦 :+1: 喜欢学习总是好的
    浮桥小麦:@臭码农 别这样说,差远了,iOS才入门吧。 最近没项目做,所以跟着同事学学后台
    臭码农:@浮桥小麦 看你主页,发现您竟然是个全栈工程师
  • a3fa355c82e1:一些可能两三个module都用到的model或者view放哪,放在公用但是也就部分用到不方便查找
    臭码农:@吴小安 你这个问题问的好,我觉得如果通用性很强的还是得拿到公共里面,如果只是两三个用到就放到最显眼的那个模块里
  • 崇山峻岭:楼主请教个问题, 同一个类的类扩展 写成一个文件还是根据不同的功能写成多个文件?
    臭码农:@崇山峻岭 我的建议是根据功能性和使用场景划分,某些类扩展只有在个别情况下用,分开写会好些
  • 751fc49dcbfd:小公司架构
    臭码农:@1140752635 大公司架构会着重考虑哪些方面?给大家介绍一下:stuck_out_tongue_winking_eye:
  • 雁小军:我只是搭车来寻找大神指点我的小网络框架 https://github.com/smlkts/HttpRequestClient
    Ps:徒儿要虚心呀,有几位仁兄说的确实,这个严格意义上来说不是架构,代码规范和基础知识略缺乏,架构的思想还需再学习,加油:ghost:
    臭码农:@雁小军 我今天再细化一下,规范一些
    雁小军:@臭码农 笨师只能看到这么多 笨师还有很长的路要走:confounded:
    臭码农:@雁小军 师傅教训的是,蠢徒一直在完善:smile:
  • 大旺大li:谢谢楼主分享
  • 2269c560c86f:学习了~~~,麻烦请教下,里面用到了BaseRequestAPI,猿题库的network,我们这个框架中没有用到这个吧?
    臭码农:@sunboy130 公共参数有一个HeaderModel啊
    2269c560c86f:@臭码农 项目中看对URL_main,应该封装到PPNetworkHelper中,否则每个网络请求都必须写上这个头,还有就是现在框架中没有对公共参数进行处理,是不是也应该封装到get,post这些接口中,目前只是对参数进行了加密处理
    臭码农:@sunboy130 是一个框架,包含了两种网络工具,根据需求自己选择好啦
  • e8151015880f:学习了,谢谢分享
  • 大神留条命:看起来很简单,说话能做到别人看起来简单还是需要一定的境界.
    臭码农:@大神留条命 理想总是要有的
  • Zz7777777:默默的问一句你的pch 和系统plist 文件 以及assets.ccassets 都放在哪一个文件夹内
    Zz7777777:@臭码农 我这边已经按照你这边的样式改了整个项目的存在的位置 蛮清晰 多谢
    臭码农:目前是放到了Supporting Files文件夹内,这样会有什么问题吗?
  • 旧人新生:写的非常好,对我们这种菜鸟来说很受用:smile:
    臭码农:@旧人新生 谦虚了,都在学习探索的过程中。
  • LL86:没觉得有新意现在
  • gitKong:只看了delegate,还行,不过要是我的话,像登陆注册项目复用性比较强的,建议用一个中间类管理,能解藕就解藕
    臭码农:请看 Manager里的 UserManager,里面是提供用户相关服务的,包括登录注册退出登录等
  • DJiPZero:规范,学习了
  • 星___尘:严格上说,这是规范,不是框架
    臭码农:@世界的过客 文章只表达思路,代码中有详细实现,看完再发表您的高见:smile:
    EvenTime:@星___尘 是的,这就是房间陈列规则,摆设风格。
    臭码农:@星___尘 本文只是阐述搭建这个框架的出发点和思路,我更希望看到更高效的基础框架,让后期也许开发清晰流畅,如果您知道不妨推荐给大家学习一下:smile:
  • 尐情緒:不错,就喜欢这样的风格,比我的更加层次分明。
  • linleiqin:你好,请问storyboard 应该放在哪里?
    臭码农:@linleiqin 在这个项目中,我没有使用storyboard,storyboard的劣势太多,特别在版本管理方面会降低开发效率,一些简单页面可以用xib拖拽达到快速开发,复杂的还是建议纯代码+masonry
  • 大神留条命:学习了
  • FicowShen:感觉还不错喔!:smile:
    FicowShen:@臭码农 嗯嗯:blush: 加油!
    臭码农:@FicowShen 有好的建议可以一起交流,github麻烦点颗星,后面我还会写些别的:grin:
  • ef344ccd72b8:下载代码下来运行不了呢 你的工程应该还没有搞好?
    臭码农:@Keep丶Dream 里面配置的是我本地服务器,你需要把他换成你的或者屏蔽掉登录模块
    Keep丶Dream:@臭码农 登录一直超时
    臭码农:@最最帅 执行 pod install 了吗?
  • 小楼东风:写的很好,再接再厉。
    臭码农:@小楼东风 多谢支持
  • ef344ccd72b8:希望能不断优化......
    臭码农:@最最帅 一直在优化,希望提出宝贵建议
  • 像孩子似的倾诉:可能对框架这个词的理解略有偏颇
    FicowShen:那么,能麻烦您给个正解吗?
    我帮楼主回复一个。因为我跟他理解差不多呢,我想知道自己错在哪里。
  • b425e98df302:这个嘛,只能证明楼主有半年ios开发经验
    郑州程序员王一:呵呵,这个楼的楼主给我们讲讲你的经验呗
    FicowShen:所以您想表达什么呢?不介意给我们看看您的框架吧?
    臭码农:10年工作经验的有何高见?能否指点一下?
  • 星痕星尘9028:不错,和我现在用的很类似,蛮喜欢这种风格,学习了.
  • MoussyL:学习了,给作者赞一个:+1:
    臭码农:给你也赞一个
  • 独木舟的木:PrefixHeader.pch 文件里那尊佛祖也是框架搭建的一部分吗🤣
    臭码农:那是不可或缺的一部分:smirk:
  • footSInRoad:很好学习了
  • 雨影:不过这个结构有个使用不太方便的地方,就是层次隐藏的太深,搜索某个类的时还能搜索,想在某个文件夹下添加类,必须一层层点开才可以。搜索到的文件夹不能直接往里边拖文件
    雨影:@草原野马 没有东西是无关紧要
    草原野马:这个架构已经够清晰了,相信熟悉的不会去在搜索。你说的问题好像就是创建文件不方便,好像真无关重要。
    臭码农:@雨影 分的细层次深 条理清晰,分的糙层次浅 杂乱无章。
  • 雨影:很不错的分类方式,我一直也用这种方式,今天看的你的又优化了下,谢谢分享

本文标题:iOS 从0到1搭建高可用App框架

本文链接:https://www.haomeiwen.com/subject/xkhgxxtx.html