1. 程式人生 > >穿過層層迷霧,走過被人走過的路,看到前人栽下的樹,歷歷在目

穿過層層迷霧,走過被人走過的路,看到前人栽下的樹,歷歷在目

前言

隨著公司業務不斷髮展,移動開發專案越來越多,專案任務時間緊,我們內部開發流程是以專案為導向,有別於一般公司對產品不斷迭代的做法,但移動端開發人員資源有限,需要在不同專案之間做業務場景切換開發,就會經常出現專案完成時間 Delay。面對這樣的問題,我們該如何去解決呢?現在瞭解到的現狀是每個業務組都有配備 Web 前端開發人員,那麼是否能把涉及到業務模組分發給具體業務組 Web 前端開發人員去開發,剝離業務模組,我們移動端開發人員則專注於框架的開發或者手機端裝置能力開發,比如可支援呼叫攝像頭,監聽網路狀態變化,提供地理位置資訊等等,有沒有這樣一套適合的解決方案呢,答案當然是有的。我們引入了可利用 Web 前端能力和移動端作業系統原生能力相結合開發模式,叫做 Hybrid 混合開發。

目錄

  • 為何選擇 Hybrid 開發模式
  • 在實踐過程中碰到什麼問題和解決
  • 經驗總結

為何選擇 Hybrid 開發模式

1,目前工作中碰到的問題

隨著公司業務飛速發展,移動端定製的專案越來越多,同時每個專案的業務邏輯呈現出複雜化和差異化特點,每個專案都需要提供 Android 版本和 IOS 版本,增加開發成本,開發週期往往又會被拖長。同時近年來前端技術蓬勃發展,HTML5 大行其道,很多主流 APP 廠商都利用 HTML5 前端能力來編寫業務模組並結合原生裝置能力進行混合開發,常見的比如淘寶、京東、微信、攜程等等。雖然目前業務專案多,但是使用者互動體驗要求不高,常見頁面也是列表,表單居多,適合充分利用HTML 5能力,因此引入Hybrid 混合開發模式,這樣只需要 Web 前端開發人員寫一遍前端業務程式碼,卻能同時在Android 系統和 IOS 系統中執行。

2,Web APP、Hybrid APP、Native APP 對比

目前主流應用程式大體分為三類:Web App、Hybrid App、 Native App,如圖:

三者區別

Web APP

Web App 指採用Html5 語言寫出的 App,不需要下載安裝。類似於現在所說的輕應用。生存在瀏覽器中的應用,基本上可以說是觸屏版的網頁應用。

優點

(1)開發成本低,更新快
(2)更新無需通知使用者,不需要手動升級
(3)能夠跨多個平臺和終端

缺點:

(1)臨時性的入口
(2)無法獲取系統級別的通知,提醒,動效等等
(3)使用者留存率低
(4)設計受限制諸多
(5)體驗較差

Hybrid App

Hybrid App 從外觀上來看是一個Native App ,實則只有一個UIWebView,裡面訪問的是一個Web App ,如新聞類和視訊類的應用普遍採取該策略:Native 的框架加上Web 的內容。不同於Native App 需要針對不同的平臺使用不同的開發語言(如使用Objective-C、Swift開發iOS應用,使用Java等開發Android應用),Hybrid App 允許開發者僅使用一套網頁語言程式碼(HTML5+CSS+JavaScript),即可開發能夠在不同平臺上部署的類原生應用 。由於Hybrid App 結合了Native app良好使用者互動體驗和Web App 跨平臺開發的優勢,能夠顯著節省移動應用開發的時間和成本,Hybrid App 得到越來越多公司的青睞。

按照網頁語言和程式語言的混合,Hybrid App 通常可以分為三種類型:

  1. 多View混合型:Native View 和 Web View 獨立展示,交替出現。 其應用主體通常是Native App,Web技術作為補充。即在需要的時候,將 Web View作為獨立的 View 執行,在 Web View內完成相關的展示操作。開發難度與Native App相當.比如:微信裡的公眾號文章使用的是Web View 。
  2. 單View混合型:在同一個View 內,Native View 和Web View 為層疊關係,同時出現。開發成本較高,難度較大,但是體驗較好。比如:百度搜索同時實現充分的靈活性和較好的使用者體驗。
  3. Web主體型:應用主體是Web View ,穿插 Native 功能,主要以網頁語言編寫。整體開發難度低,基本可以實現跨平臺,而使用者體驗好壞,主要取決於底層中介軟體的互動與跨平臺能力。比如:專案管理工具 Basecamp 使用Web view呈現內容,呼叫系統原生 API 實現介面導航等功能來提高使用者體驗。

Hybrid App 也並非是完美的解決方案。由於其使用 HTML5,某些依賴於複雜的原生功能或者繁重的過渡動畫的應用會出現卡頓。同時,為了模擬Native App 的UI和感官,需要投入額外的時間和精力;儘管可以跨平臺,但是並不能完全支援所有的裝置和作業系統。最後,如果應用的體驗不夠原生化,如一個簡單的網站,則還有被Apple App Store拒絕的風險。

Native App

Native APP 指的是原生程式,一般依託於作業系統,有很強的互動,是一個完整的 App,可拓展性強。需要使用者下載安裝使用。

優點:

(1)打造完美的使用者體驗,效能穩定
(2)操作速度快,上手流暢
(3)訪問本地資源(通訊錄,相簿)
(4)設計出色的動效,轉場,
(5)擁有系統級別的貼心通知或提醒,使用者留存率高

缺點:

(1)分發成本高(不同平臺有不同的開發語言和介面適配)
(2)維護成本高(例如一款App已更新至V5版本,但仍有使用者在使用V2, V3, V4版本,需要更多的開發人員維護之前的版本)
(3)更新緩慢,根據不同平臺,提交–稽核–上線 等等不同的流程,需要經過的流程較複雜

三者技術特性

如下圖表中對比了Native App、 Hybrid App、Web App在不同方面的表現,可以根據實際情況選擇最佳的解決方案。

三者技術特性

3,主流 APP Hybrid 應用比例

那麼在實際應用場景中,有哪些選擇了Hybrid app呢?實際上,我們很可能使用過很多Hybrid app,卻並沒有意識到它們是借了Native臺子唱戲的Web app。根據Appcelerator的官網,目前單是執行基於它的平臺搭建的Hybrid app的裝置就有近2.86億臺。國外常見的有LinkedIn、Yelp、Netflix、Wunderlist ,國內主流的大廠基本也是採用了Hybrid 模式,應該是應用很廣泛,同時技術上也是成熟穩定。

應用廣泛

4,選擇 Hybrid 混合開發的原因

  1. Hybrid 開發模式在開發頁面 UI 上有天生的便利,而原生的則如果需要一個比較華麗的介面,就需要花很長的時間去開發。

  2. 在業務上,看具體情況,有些簡單業務在 Web上就可以處理,而如果涉及到複雜的業務,則可以用原生來寫。

  3. 在基本能力上,原生的強,可以提供手機端獨有的特性,但 Hybrid 則需要依賴 Javascript 中間層進行轉化獲取裝置能力。

  4. 對於少介面,重業務的可以用原生,對於多介面,重效果的,可以用 Web 方式開發

在實踐過程中碰到什麼問題和解決

專案背景介紹

目前在一個專案實行的開發模式就是 Hybrid 混合開發,Web 技術與 Android 原生能力結合開發,Web 技術負責介面開發和相關業務, Android 原生能力則提供手機端特有裝置能力,比如呼叫攝像頭,網路狀態監聽,資料庫操作等等。但這個專案的特殊性相關業務與我們提供的 Android 原生外掛能力高度耦合,比如為這個專案提供資料庫外掛就是專門定製開發的,對於 Excel 外掛的能力也是高度依賴一機一檔相關欄位,這跟我們選型用Hybrid 混合開發模式 的初心是相背離。我們初心是希望 Web 開發人員只需要專注於業務開發和介面繪製,原生部分則是提供相應的Android 裝置能力集即可,每個外掛跟業務是完全無關,這樣就可以做到原生開發和Web開發互相解耦,兩者之間通過介面隔離即可。

實踐過程中碰到的問題

無論如何,一機一檔專案是第一個應用 Hybrid 混合開發進行實戰的專案,遇到的問題或者坑都是很正常,積極面對解決,並且不斷進行總結和反思。把之前碰到的問題,簡單羅列總結下:

  1. 開發人員除錯困難問題。前端人員在開發時候是編寫HTML5頁面,所執行的環境跟 PC 端有很大的不同,因為需要執行在具體手機的環境上,因此需要每次編寫完,需要通過移動端人員整合打包出一個APP 包進行安裝驗證,每新增或修改一個頁面就需要重新打包驗證,每次都需要整合測試,步驟繁瑣,效率低下。
  2. 專案整合測試問題。Android 系統 Webview 和 PC 端瀏覽器核心版本差異問題導致載入效果不一致。
  3. 前端開發框架相容問題。前端開發人員技術選型是基於 Vue.js 框架,這是一個漸進式 Javascript 框架,剛開始不支援。
  4. 文件不規範問題。在前期開發階段,文件提供不詳細,開發人員使用規則不清楚,導致溝通成本增加。
  5. Webview 效能問題。

如何解決

  1. 關於除錯困難問題。提供一個除錯工具叫做 Chrome DevTool,通過 Inspect 模式載入手機端裡的 HTML5 頁面,為何選擇用 Chrome,因為Chrome 是目前主流前端開發除錯利器,不僅能支援 Web 端開發,對於 HTML5 頁面除錯開發同樣是能監聽到 Javascript 報錯或 CSS 報錯,對於資源、網路、日誌、記憶體等等,都是一步到位。同時在 APP 裡提供一個線上除錯環境,就是 Web 前端開發人員佈置一個站點,在手機端通過 IP 地址遠端訪問站點,這樣就可以在手機端實時看到剛剛修改內容是什麼。
  2. 關於專案整合測試問題。在整合測試階段,對Android 系統 Webview 和 PC 端瀏覽器核心版本區別有進一步認識,在Android 5.0 之前選用的是 Webkit 核心來載入 Web 資原始檔,而在 Android 5.0 之後,則選用 Chromium 作為核心來載入,那麼在為 PC 端瀏覽器端,如果你選擇的是 Chorme 作為你預設瀏覽器的話,它的核心也是 Chromium 。儘管兩者核心型別一樣,都是 Chromium ,但兩者載入 Javascript 效果上表現也不一樣,比如最新瀏覽器版本可支援 ES 6 特性,但是在最新版的手機上就不一定 ES 6特性,目前通過調查 Android 5.0 之前的系統市場佔有率,發現比例為不到20%,暫時適配到 Android 5.0 版本。
  3. 關於前端開發框架相容問題。剛開始選用 Hybrid 開發模式時,對於公司內部 前端開發人員選用何種前端框架不甚瞭解,我們這邊提供的 Demo 則是最原始的 HTML + Javascript + CSS 寫法,以為前端人員只需要簡單瞭解下就能上手,但在實踐中發現卻不是這樣的。他們選型的前端技術是基於 Vue.js ,因為 Vue.js 是需要編譯打包,生成釋出的內容是混淆過的HTML + Javascript ,裡面 Javascript 檔案載入順序使得我們開發 Javascript 外掛呼叫引起問題,那樣就會導致前端人員在呼叫具體外掛能力時候,發現這個外掛裡的某個方法還沒定義,就導致頁面資料出錯。後來通過了解 Vue.js 開發方式,調整專案工程中 Javascript 執行順序, 確保具體外掛呼叫在 Vue.js 執行前觸發。
  4. 關於文件不規範問題。在前期開發階段,前端人員沒有統一查詢目前已有外掛能力的地方,僅僅根據我們提供的 Javascript 檔案裡的方法註釋,雖然是針對每個方法的 Demo 用法,但是在實際開發中,前端開發人員也會調用出錯。不是這個方法回撥方法寫錯,就是引數型別傳入傳錯,這樣就導致的一個結果,前端開發人員不斷地過來詢問這個方法是如何呼叫的,我明明已經根據你的 Demo 寫法進行編碼了,為何還是報錯的,前期的溝通成本還是很高。所以需要一個提供統一文件地方,裡面寫明瞭具體配置如何,寫法如何,怎麼是一步一步走,基本上可以避免類似的錯誤,更好的提高工作效率,減少溝通成本,所以一個規範的文件是很有必要的。
  5. 關於 WebView 效能載入問題。這是在解決 WebView 載入 HTML + Javascript + CSS 等資源時發現一個白屏問題,同時用 HTML5 做頁面本身就會比原生載入來的慢。為了提高使用者體驗,在載入等待時,提供一個載入框來提示,等 HTML 資原始檔全部渲染完畢後,等待框再消失,這樣就可以避免一定的白屏現象。

經驗總結

整體來說,為何會選擇 Hybrid 混合開發模式是基於當前業務場景需要,技術是服務於業務發展,業務場景變化導致技術解決方案的選型也需要相應變化。面對以專案導向的開發現狀,不能一昧追求最新最酷的技術,也不能對過時的技術方案過分保守,應該需要對當前業務場景進行判斷,選擇合適的解決方案才最佳的策略,沒有一勞永逸的技術手段,只有時刻變化的業務需求和不斷更新迭代技術方案。通過在具體專案中實戰,面對問題,積極解決問題,也正是在解決問題過程中,產生新的想法和嘗試,不斷地完善框架能力,使得框架功能越來越全,進而更好的服務於業務開發問題,提高業務響應能力,降低開發成本,提升工作效率。