接下來要說的一個系列,是一個完整的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佈局文件。