Hybrid App 跨平臺熱更新方案實踐 附帶源碼

前言

移動開發(fā)的跨平臺與快速發(fā)布一直是開發(fā)者的追求油湖,也是技術的一個發(fā)展趨勢饰豺,現(xiàn)在各大廠開始有了自己的大前端團隊晦闰,所以我們也開始了自己的探索嚣鄙,目前來說主要有兩種思路:

  • Hybrid App 代表:Cordova
    通過Webview加載Web頁面吻贿,在NativeWeb頁面之間建立雙向通信
  • H5代碼Native化 代表:ReactNative,Weex
    使用各平臺Api,把H5代碼編譯成二進制代碼直接運行

其實關于這兩種思路對比哑子,網(wǎng)上有很多大牛分析的很全面了舅列,總結來說各有利弊很難完美肌割,本篇文章我們主要講一下Hybrid App實踐,采用前后端分離以及單頁應用技術開發(fā)Web頁面帐要,使用WebView加載Web頁面把敞,并通過JS通信提供一些Native層的支持,通過接口獲取差異化頁面資源文件榨惠,在本地整合更新奋早,還可以達到熱更新的需求。在我看來此方案更適用于需要快速發(fā)布赠橙、多端兼容耽装、對性能要求稍低的業(yè)務,正好符合我們的需求简烤。

源碼

這里我整理了Android端會用到代碼,包含JS通信摇幻,文件處理工具類横侦,閃屏輔助類和WebView的封裝。
Github地址:https://github.com/free46000/HybridFoundation绰姻,請大家多多關注枉侧,由于源碼并沒有完善,所以暫時沒有發(fā)布到Maven倉庫

方案詳解

既然確定了方向狂芋,那么就應該確定具體的方案了榨馁,通過自己的經(jīng)驗和網(wǎng)上資料整理,畫了時序圖:


image
image

按照圖上的時序帜矾,接下來說一下每一步中的實踐翼虫,以及碰到的坑。下面講解

初次安裝

  • 打包
    在打包程序時這一步主要是把Html相關資源文件壓縮后放在assets文件夾下即可
  • 安裝
    用戶安裝完應用程序打開后屡萤,檢測是否為初次使用珍剑,如果是則通過程序直接解壓包內(nèi)資源到手機存儲上即可,不局限于SD卡死陆。

展示頁面

  • 閃屏頁展示
    由于上面的解壓資源招拙,還有Webview初始化、JS的加載執(zhí)行措译、html的渲染都是耗時操作别凤,并且都是發(fā)生在Html展示之前,所以我們選擇把閃屏頁用Native原生代碼來編寫领虹,采用覆蓋WebView所在頁面的方案规哪,這樣在閃屏頁隱藏的時候,用戶就可以看到業(yè)務界面塌衰,提升用戶體驗由缆。
    注:另外提供Android兩種閃屏優(yōu)化的小技巧注祖,使用透明主題或者設置主題背景圖片

  • 加載本地Html頁面
    直接使用WebView#loadUrl()加載本地資源文件即可。由于WebView加載不同頁面會出現(xiàn)閃屏的問題均唉,所以我們采用Vue + Vue Router構建單頁應用是晨。
    這里Vue Router會有一個小坑,提醒大家注意一下:Vue Router默認采用hash模式舔箭,會有一個丑陋的#符號罩缴,作為一個有追求的程序員怎么能允許這種很丑的hash,一種更優(yōu)雅的方式使用HTML5 History模式层扶,但是不幸的是箫章,加載本地資源文件的方式并不能正常解析HTML5 History模式的url,所以只能采用hash模式镜会。

  • 數(shù)據(jù)請求
    為了節(jié)省用戶的流量和時間檬寂,需要把Html資源文件存儲在本地,這樣數(shù)據(jù)的請求必須在客戶端完成戳表。有兩種方案供選擇:
    一是Native層攔截并請求數(shù)據(jù)再返回給Html層去展示桶至,這樣會增加工作量,也不利于職責的分離匾旭,所以放棄镣屹。
    二是直接使用JS請求數(shù)據(jù),這樣會出現(xiàn)跨域訪問的問題价涝,相比較來說還是這個比較容易解決的女蜈,采用CORS即可

  • Native調(diào)用JS
    Native層調(diào)用JS比較簡單,執(zhí)行一段JS代碼即可色瘩,如:javascript:callJS()

  • JS調(diào)用Native
    JS層調(diào)用Native,在Android上來說主要分為三種:
    一:通過WebView#addJavascriptInterface()進行映射伪窖,使用起來簡單,但是有安全風險居兆,棄用
    二:自定義協(xié)議然后由Native層攔截并解析請求惰许,使用起來復雜师坎,容易和業(yè)務耦合阎毅,也不是最優(yōu)選谱俭,棄用
    三:攔截JS#prompt()方法并解析饿自,使用起來復雜甚垦,但是比第一種更安全蜗帜,比第二種靈活来惧,所以使用此方案

資源文件獲取

資源文件采取差異化更新方案洽蛀,本地存儲一個標識耙蔑,可以為版本號或者更新時間见妒,這個可以和后端同學一起商量確定。
資源文件下載還有推送之類的由于Html的局限性甸陌,所以還是直接由Native層做比較合適须揣,下面簡單講解下應用中的兩種更新方式:

  • 服務端推送下發(fā)
    可以通過集成第三方的推送服務盐股,在客戶端收到更新推送后主動去請求下載差異化文件
  • 主動請求
    可以在選擇合適的時機,如在應用啟動時去請求差異化文件

資源文件更新

根據(jù)差異化清單對資源文件進行整合耻卡,存放在臨時目錄中疯汁,然后在第二次打開應用時更換,并展示更新后的界面卵酪,達到熱更新的效果幌蚊。

總結

本文只是概括的講了結構的內(nèi)容,可能會遺漏一些要點溃卡,如果大家有什么問題歡迎留言或者去GitHub上提交issue

作者開源了一個優(yōu)雅的實現(xiàn)多類型的RecyclerView類庫 支持DataBinding Form表單錄入溢豆,跨多個RecyclerView拖動 Github地址:https://github.com/free46000/MultiItem

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瘸羡,隨后出現(xiàn)的幾起案子漩仙,更是在濱河造成了極大的恐慌,老刑警劉巖犹赖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件队他,死亡現(xiàn)場離奇詭異,居然都是意外死亡冷尉,警方通過查閱死者的電腦和手機漱挎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門系枪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雀哨,“玉大人,你說我怎么就攤上這事私爷∥砉祝” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵衬浑,是天一觀的道長捌浩。 經(jīng)常有香客問我,道長工秩,這世上最難降的妖魔是什么尸饺? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮助币,結果婚禮上浪听,老公的妹妹穿的比我還像新娘。我一直安慰自己眉菱,他們只是感情好迹栓,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著俭缓,像睡著了一般克伊。 火紅的嫁衣襯著肌膚如雪酥郭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天愿吹,我揣著相機與錄音不从,去河邊找鬼。 笑死洗搂,一個胖子當著我的面吹牛消返,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耘拇,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼撵颊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惫叛?” 一聲冷哼從身側響起倡勇,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘉涌,沒想到半個月后妻熊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡仑最,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年扔役,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片警医。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡亿胸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出预皇,到底是詐尸還是另有隱情侈玄,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布吟温,位于F島的核電站序仙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鲁豪。R本人自食惡果不足惜潘悼,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爬橡。 院中可真熱鬧治唤,春花似錦、人聲如沸堤尾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辞槐,卻和暖如春掷漱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背榄檬。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工卜范, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鹿榜。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓海雪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親舱殿。 傳聞我的和親對象是個殘疾皇子奥裸,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,264評論 25 707
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件沪袭、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,117評論 4 61
  • 這篇博客主要來介紹 WebView 的相關使用方法冈绊,常見的幾個漏洞侠鳄,開發(fā)中可能遇到的坑和最后解決相應漏洞的源碼,以...
    Shawn_Dut閱讀 7,236評論 3 55
  • 橘子啊湫 她說 我圍繞著你 而你 卻封閉著自己 我喜歡你 你曾喜歡他 后來 你誰也不喜歡 包括我 與你說的話 再也...
    不良公子閱讀 390評論 5 2
  • 人跟人的關系就是那么淡薄,無論曾經(jīng)有過什么毅该,愛過恨過痛過博秫,分開了就再也毫無關系,干凈利落鹃骂。
    張氏了了閱讀 214評論 0 0