hybrid混合编译开发 更新

移动开发的跨平台与快速发布一直是开发者的追求,也是技术的一个发展趋势,现在各大厂开始有了自己的大前端团队,所以我们也开始了自己的探索,目前来说主要有两种思路:

  • Hybrid App 代表:Cordova 通过Webview加载Web页面,在NativeWeb页面之间建立双向通信
  • H5代码Native化 代表:ReactNative,Weex等 使用各平台Api,把H5代码编译成二进制代码直接运行

其实关于这两种思路对比,网上有很多大牛分析的很全面了,总结来说各有利弊很难完美,本篇文章我们主要讲一下Hybrid App实践,采用前后端分离以及单页应用技术开发Web页面,使用WebView加载Web页面,并通过JS通信提供一些Native层的支持,通过接口获取更新后的差异化页面资源文件,在本地覆盖,就可以达到热更新的需求。在我看来此方案更适用于需要快速发布、多端兼容、对性能要求稍低的业务,正好符合我们的需求。

方案详解

既然确定了方向,那么就应该确定具体的方案了,通过自己的经验和网上资料整理,画了时序图: [图片上传失败...(image-1a9bc6-1546848457294)]

按照图上的时序,接下来说一下每一步中的实践,以及碰到的坑。下面讲解

初次安装

  • 打包 在打包程序时这一步主要是把Html相关资源文件压缩后放在assets文件夹下即可
  • 安装 用户安装完应用程序打开后,检测是否为初次使用,如果是则通过程序直接解压包内资源到手机存储上即可,不局限于SD卡。

展示页面

  • 闪屏页展示 由于上面的解压资源,还有Webview初始化、JS的加载执行、html的渲染都是耗时操作,并且都是发生在Html展示之前,所以我们选择把闪屏页用Android原生代码来编写,采用覆盖WebView所在Activity的方案,这样在闪屏页隐藏的时候,用户就可以看到业务界面,可以提升用户体验。 注:另外提供两种闪屏优化的小技巧,使用透明主题或者设置主题背景图片

  • 加载本地Html页面 直接使用WebView#loadUrl()加载本地资源文件即可。由于WebView加载不同页面会出现闪屏的问题,所以我们采用Vue + Vue Router构建单页应用即可。 这里Vue Router会有一个小坑,提醒大家注意一下:Vue Router默认采用hash模式,会有一个丑陋的#符号,作为一个有追求的程序员怎么能允许这种很丑的hash,一种更优雅的方式使用HTML5 History模式,但是不幸的是,加载本地资源文件的方式并不能正常解析HTML5 History模式的url,所以只能采用hash模式。

  • 数据请求 为了节省用户的流量和时间,需要把Html资源文件存储在本地,这样数据的请求必须在客户端完成。有两种方案供选择: 一是Native层拦截并请求数据再返回给Html层去展示,有我们采用前后端分离直接通过JS请求接口获取数据即可,这样会增加工作量,也不利于职责的分离,所以放弃。 二是直接使用JS请求数据,这样会出现跨域访问的问题,相比较来说还是这个比较容易解决的,采用CORS即可

  • Native调用JS Native层调用JS比较简单,执行一段JS代码即可,如:javascript:callJS()

  • JS调用Native JS层调用Native主要分为三种: 一:通过WebView#addJavascriptInterface()进行映射,使用起来简单,但是有安全风险,弃用 二:自定义协议然后由Native层拦截并解析请求,使用起来复杂,容易和业务耦合,也不是最优选,弃用 三:拦截JS#prompt()方法并解析,使用起来复杂,但是比第一种更安全,比第二种灵活一些,所以使用此方案

资源文件获取

资源文件采取差异化更新方案,本地存储一个标识,可以为版本号或者更新时间,这个可以和后端同学一起商量确定,资源文件下载还有推送之类的由于Html的局限性,所以还是直接由Native层做比较合适,下面简单讲解下应用中的两种更新方式:

  • 服务端推送下发 可以通过集成第三方的推送服务,在客户端收到更新推送后主动去请求下载差异化文件
  • 主动请求 可以在选择合适的时机,如在应用启动时去请求差异化文件

资源文件更新

根据差异化清单对资源文件进行整合,存放在临时目录中,然后在第二次打开应用时更换,并展示更新后的界面,达到热更新的效果。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • 社交网络日新月异,需要更快,更灵活的技术架构才能满足用户日益丰富的媒体需求,Hybrid App架构具备了快速发布...
    架构师ArchSummit阅读 1,102评论 0 5
  • 1 Webpack 1.1 概念简介 1.1.1 WebPack是什么 1、一个打包工具 2、一个模块加载工具 3...
    Kevin_Junbaozi阅读 6,645评论 0 16
  • 夜声寂,旧时已,千古怎堪回忆?观古道红尘,千头万绪,幽思斯人,只道可惜,若非心中起意,谁可蒙蔽?祸莫大于轻敌,罪莫...
    剑待折断人待亡阅读 153评论 0 0
  • 手抄卷 文/柳诗雅 风吹窗外 扰了清梦 泼墨填词 笔下痴 深卷院巷 亲吻一树梅花 轻嗅 那几缕幽香 字迹里的念 笔...
    柳诗雅阅读 1,231评论 2 7
  • Part51.你好,初见先生3 “小兰,你在干嘛?” “小兰,这个票你开。” “小兰,你……” 兰溪这一整天的工作...
    婪卿阅读 350评论 10 15