接下来要说的一个系列,是一个完整的App应用所须要的企业级框架设计,是我这2年来在无线客户端这个领域摸爬滚打的,总结沉淀的心得体会,中途吃了不少亏,走过不少弯路,加了不少班,一次又一次的重构,不断的学习,才知道,哦,原来iOS要这么作,原来Android要那么作,而后回过头来再看看我最熟悉的WP,哦,原来WP还能够作的更好。javascript
2年间,我还接手了MobileAPI的维护,从而让客户端和服务器端的配合更顺畅,中途还发明了几个好用的工具,从服务器端到客户端这条路我打通了。再而后,我还碰了碰tcp+protobuf,WP8的项目就是基于此开发的。html
此外,我还打通了另外一条路,那就是前端设计人员和客户端开发人员的协做,为此,专门设计了iOS UI框架和WP UI框架,前端设计人员在拿到美工的设计稿后,再也不提供标注图,而是基于UI 框架,直接提供xib或者xaml,客户端开发人员能够直接拿去使用。对于Android,暂时我尚未太好的解决方案。前端
也许有从事iOS开发的朋友会问,为何要设计企业级框架呢?没有它,我也能够很好的写程序啊。也能够快速开发一个App啊。至少,我手下的iOS team都是这么认为的。而Android team和WP team能比较容易接受这样的框架。java
说说个人想法,一家之言。我想是由于Android是基于Java的,通过这么多年的沉淀,Java对设计模式、代码规范这些概念已经有了积累。并且Android在设计的时候,就考虑到这些东西,因此它会有Activity、Intent、Adapter这些“积木”,搭建起一个完整的App。而微软出品的WP,是基于.NET framework体系的,而.NET自己就充斥着设计模式的思想。程序员
对了,也许你获得那个点了——iOS在这方面显得有些贫血。除了MVC和delegate和Notification,其它什么都没有。因此,你能够在一个ViewController里面写3000行代码,而没有任何规定说你这样作是错的;不使用xib而在viewDidLoad中手动建立页面全部控件,固然,我问过不少到我这里面试的人,他们以及他们的公司都认为这样作没什么很差,甚至更灵活。大部分的iOS程序员,都已经习惯于面向过程的编程方式,而抵触OOP。面试
我也见过一些到我这里来面试的Leader,他们来自大公司,这些公司都有一些框架设计,或者说,业界规范,好比说,数据缓存,图片缓存、网络请求的封装。编程
其实,越是什么都没有,才越好作框架。咱们能够借鉴Android和WP的设计,甚至是网站开发、javascript开发、windows开发的经验和模式,补充到iOS的框架中去。windows
2年来,我就在坚持不懈地作这件事,基本上能够认为是作成了,由iOS、Android、WP三套框架组成,它们的设计思想是同样的,包括如下18点,其中最重要的是前六点,称之为框架设计的六大要素。设计模式
框架设计六大要素:缓存
1.基类的设计
没有基类,就不要说有框架。并且不只仅是一个基类,对于一个企业级的App而言,框架层要有一个基类,里面只存放一些与框架有关的共用逻辑。App层也要有一个二级基类,继承自框架级的那个基类,里面存放的是App相关的共用逻辑。
2.自定义App的生命周期。
对于一个页面从初始化到消亡,每一个客户端系统各自有本身的生命周期。咱们发现,在初始化的时候,要作过多的事情,代码会不少很乱,所以有必要细分,从新规划,定义新的生命周期。
3.发起网络请求(如下简称MobileAPI)得到数据。不少书都在大讲特讲手机控件的使用、IO语法、酷炫动画。却对MobileAPI的介绍语焉不详。其实这才是最重要的一个环节,包括请求失败后的自动重试、如何处理JSON、如何统一API的调用形式并使之最简,对于多个API调用,是串行调用仍是并发调用及各自的处理方式。
此外,咱们常常面对的是HTTP+JSON形式的网络请求,对于转换为TCP+protobuf形式,则须要作的事情还有不少。
不管是HTTP+JSON,仍是TCP+protobuf,都要考虑数据缓存,而且要让上层使用者感觉不到数据是来自网络请求仍是缓存。
4.图片缓存
服务器端,有2种解决方案。
客户端的解决方案,iOS、Android、WP实现思想相同,只是实现手法不太同样。
5.导航器(仅适用于iOS和WP)
跳转到一个页面很简单,可是要整个App都采用一种调整风格,要求iOS、Android、WP都采用一种风格,就不大容易了,尤为是传递参数,以及处理登陆后的回调。
6.适配器
Android在这一方面作的是最好的。对于iOS和WP,咱们不妨学习一下Android,设计出各自的自动适配器。
接下来就是一些细节了:
7.登陆
别看一个小小的登陆框,里面的学问可大了。好比说,记住密码要怎么实现,才能保证用户下次打开App不须要登录。好比Cookie的读写。好比登陆后要去往哪里?好比重复输入3次错误后要求输入验证码的实现?好比最安全的登录解决方案设计。
8.与JS的互操做
你可能会第一时间想到PhoneGap。但其实,对于一个原生的App框架,只要支持简单的JS交互就够了。
9.时间校准
如何让客户端时间与服务器时间保持一致,这对于电子商务相当重要。
10.广告处理器
广告是目前App最赚钱的一个功能。如何设计一个通用的广告机制,并且要脱离App总体的业务逻辑,实现松耦合,相当重要。
11.弹出框链
这是职责链模式在App中的典型应用。
12.进度条
进度条常常和网络请求联系在一块儿,分两种,一种是调用MobileAPI时,锁住当前页面不能动,知道请求返回结果;另外一种是锁住局部页面,页面其余地方能够操做。
13.日志工具
对于那些很难复现的bug,日志工具所记下的内容,能告诉咱们一切。日志分两种,调试时直接打在控制台上;直接写入到在手机中。
14.单元测试
本文告诉你App上的单元测试要怎么写?以及何时须要单元测试。
15.MVC仍是MVVM
iOS和Android使用MVC,WP使用MVVM,本文告诉你,使用哪种,不是绝对的,一切根据业务逻辑的复杂程度而定。以此来消除一个页面3000行代码的问题。
16.分页
上拉分页,下拉刷新。3个平台的分页各有不一样,须要注意的细节都不能少,好比说,没有数据时怎么办?
17.低流量模式
在2G网络下,网速贼慢,所以,咱们要设计一种能认用户快速看到内容的机制。这就是低流量模式。其实,这是App的一种需求,只是不少App并无考虑过。
18.UI框架设计
在分工愈来愈细的今天,咱们能够把一部分工做分出去给其它Team。好比UI设计,彻底可让前端人员(熟悉js和html)来作,这就须要咱们为前端Team提供一个好用的App UI的设计工具。这样,咱们能拿到的就再也不是设计稿或者标注图,而是画好的xib、xaml以及Android的xml布局文件。