Hybrid App技术解析

随着 Web 技术和移动设备的快速发展,Hybrid 技术已经成为一种最主流最常见的方案。一套好的 Hybrid架构方案 能让 App 既能拥有极致的体验和性能,同时也能拥有 Web技术 灵活的开发模式、跨平台能力以及热更新机制。

现有混合方案

Hybrid App,俗称混合应用,即混合了 Native技术 与 Web技术 进行开发的移动应用。现在比较流行的混合方案主要有三种,主要是在UI渲染机制上的不同:

  1. 基于 WebView UI 的基础方案,市面上大部分主流 App 都有采用,例如微信JS-SDK,通过 JSBridge 完成 H5 与 Native 的双向通讯,从而赋予H5一定程度的原生能力。
  2. 基于 Native UI 的方案,例如 React-Native、Weex。在赋予 H5 原生API能力的基础上,进一步通过 JSBridge 将js解析成的虚拟节点树(Virtual DOM)传递到 Native 并使用原生渲染。
  3. 另外还有近期比较流行的小程序方案,也是通过更加定制化的 JSBridge,并使用双 WebView 双线程的模式隔离了JS逻辑与UI渲染,形成了特殊的开发模式,加强了 H5 与 Native 混合程度,提高了页面性能及开发体验。

以上的三种方案,其实同样都是基于 JSBridge 完成的通讯层,第二三种方案,其实可以看做是在方案一的基础上,继续通过不同的新技术进一步提高了应用的混合程度。因此,JSBridge 也是整个混合应用最关键的部分。

Hybrid技术原理

Hybrid App的本质,其实是在原生的 App 中,使用 WebView 作为容器直接承载 Web页面。因此,最核心的点就是 Native端 与 H5端 之间的双向通讯层,其实这里也可以理解为我们需要一套跨语言通讯方案,来完成 Native(Java/Objective-c/...) 与 JavaScript 的通讯。这个方案就是我们所说的 JSBridge,而实现的关键便是作为容器的 WebView,一切的原理都是基于 WebView 的机制。

分享图片

(一) JavaScript 通知 Native

基于 WebView 的机制和开放的 API,实现这个功能有三种常见的方案:

  • API注入,原理其实就是 Native 获取 JavaScript环境上下文,并直接在上面挂载对象或者方法,使 js 可以直接调用,Android 与 IOS 分别拥有对应的挂载方式。
  • WebView 中的 prompt/console/alert 拦截,通常使用 prompt,因为这个方法在前端中使用频率低,比较不会出现冲突;
  • WebView URL Scheme 跳转拦截;

第二三种机制的原理是类似的,都是通过对 WebView 信息冒泡传递的拦截,从而达到通讯的,接下来我们主要从 原理-定制协议-拦截协议-参数传递-回调机制 5个方面详细阐述下第三种方案 -- URL拦截方案。

1. 实现原理

在 WebView 中发出的网络请求,客户端都能进行监听和捕获

2. 协议的定制

我们需要制定一套URL Scheme规则,通常我们的请求会带有对应的协议开头,例如常见的  或者 file://1.jpg,代表着不同的含义。我们这里可以将协议类型的请求定制为:

xxcommand://xxxx?param1=1&param2=2

这里有几个需要注意点的是:

(1) xxcommand:// 只是一种规则,可以根据业务进行制定,使其具有含义

不同的协议头代表着不同的含义,这样便能清楚知道每个协议的适用范围。

(2) 这里不要使用 location.href 发送,因为其自身机制有个问题是同时并发多次请求会被合并成为一次,导致协议被忽略,而并发协议其实是非常常见的功能。

(3) 通常考虑到安全性,需要在客户端中设置域名白名单或者限制。

3.协议的拦截

客户端可以通过 API 对 WebView 发出的请求进行拦截:

  • IOS上: shouldStartLoadWithRequest
  • Android: shouldOverrideUrlLoading

当解析到请求 URL 头为制定的协议时,便不发起对应的资源请求,而是解析参数,并进行相关功能或者方法的调用,完成协议功能的映射。

4.协议回调

由于协议的本质其实是发送请求,这属于一个异步的过程,因此我们便需要处理对应的回调机制。这里我们采用的方式是JS的事件系统,这里我们会用到 window.addEventListener 和 window.dispatchEvent这两个基础API;

  • 1.发送协议时,通过协议的唯一标识注册自定义事件,并将回调绑定到对应的事件上。
  • 2.客户端完成对应的功能后,调用 Bridge 的dispatch API,直接携带 data 触发该协议的自定义事件。

5.参数传递方式

由于 WebView 对 URL 会有长度的限制,因此常规的通过 search参数 进行传递的方式便具有一个问题,既 当需要传递的参数过长时,可能会导致被截断,例如传递base64或者传递大量数据时。

因此我们需要制定新的参数传递规则,我们使用的是函数调用的方式。这里的原理主要是基于:

Native 可以直接调用 JS 方法并直接获取函数的返回值。

我们只需要对每条协议标记一个唯一标识,并把参数存入参数池中,到时客户端再通过该唯一标识从参数池中获取对应的参数即可。

(二) Native 通知 Javascript

由于 Native 可以算作 H5 的宿主,因此拥有更大的权限,上面也提到了 Native 可以通过 WebView API直接执行 Js 代码。这样的权限也就让这个方向的通讯变得十分的便捷。

  • IOS: stringByEvaluatingJavaScriptFromString
// Swift
webview.stringByEvaluatingJavaScriptFromString("alert(‘NativeCall‘)")
  • Android: loadUrl (4.4-)
// 调用js中的JSBridge.trigger方法
// 该方法的弊端是无法获取函数返回值;
webView.loadUrl("javascript:JSBridge.trigger(‘NativeCall‘)")

基于上面的原理,我们已经明白 JSBridge 最基础的原理,并且能实现 Native <=> H5 的双向通讯机制了。

分享图片

(三) JSBridge 的接入

接下来,我们来理下代码上需要的资源。实现这套方案,从上图可以看出,其实可以分为两个部分:

  • JS部分(bridge): 在JS环境中注入 bridge 的实现代码,包含了协议的拼装/发送/参数池/回调池等一些基础功能。
  • Native部分(SDK): 在客户端中 bridge 的功能映射代码,实现了URL拦截与解析/环境信息的注入/通用功能映射等功能。

我们这里的做法是,将这两部分一起封装成一个 Native SDK,由客户端统一引入。客户端在初始化一个 WebView 打开页面时,如果页面地址在白名单中,会直接在 HTML 的头部注入对应的 bridge.js。这样的做法有以下的好处:

  • 双方的代码统一维护,避免出现版本分裂的情况。有更新时,只要由客户端更新SDK即可,不会出现版本兼容的问题;
  • App的接入十分方便,只需要按文档接入最新版本的SDK,即可直接运行整套Hybrid方案,便于在多个App中快速的落地;
  • H5端无需关注,这样有利于将 bridge 开放给第三方页面使用。

这里有一点需要注意的是,协议的调用,一定是需要确保执行在bridge.js 成功注入后。由于客户端的注入行为属于一个附加的异步行为,从H5方很难去捕捉准确的完成时机,因此这里需要通过客户端监听页面完成后,基于上面的事件回调机制通知 H5端,页面中即可通过window.addEventListener(‘bridgeReady‘,e => {})进行初始化。

(四) App中 H5 的接入方式

将 H5 接入 App 中通常有两种方式:

(1) 在线H5,这是最常见的一种方式。我们只需要将H5代码部署到服务器上,只要把对应的 URL地址 给到客户端,用 WebView 打开该URL,即可嵌入。该方式的好处在于:

  • 独立性强,有非常独立的开发/调试/更新/上线能力;
  • 资源放在服务器上,完全不会影响客户端的包体积;
  • 接入成本很低,完全的热更新机制。

但相对的,这种方式也有对应的缺点:

  • 完全的网络依赖,在离线的情况下无法打开页面;
  • 首屏加载速度依赖于网络,网络较慢时,首屏加载也较慢;

通常,这种方式更适用在一些比较轻量级的页面上,例如一些帮助页、提示页、使用攻略等页面。这些页面的特点是功能性不强,不太需要复杂的功能协议,且不需要离线使用。在一些第三方页面接入上,也会使用这种方式,例如我们的页面调用微信JS-SDK。

(2) 内置包H5,这是一种本地化的嵌入方式,我们需要将代码进行打包后下发到客户端,并由客户端直接解压到本地储存中。通常我们运用在一些比较大和比较重要的模块上。其优点是:

  • 由于其本地化,首屏加载速度快,用户体验更为接近原生;
  • 可以不依赖网络,离线运行;

但同时,它的劣势也十分明显:

  • 开发流程/更新机制复杂化,需要客户端,甚至服务端的共同协作;
  • 会相应的增加 App 包体积;

这两种接入方式均有自己的优缺点,应该根据不同场景进行选择。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1.小程序的优缺点优点:不需下载、卸载使用方便缺点:嵌套在微信中,属于微信的子应用2.使用的技术实际上是Hybrid技术的应用HybridApp(混合模式移动应用),使用网页语言和程序语言共同开发小程序兼具了NativeApp所有优势,也兼具了WebApp使用Html5跨平台开发低成本注:微信小程序与传
端口类型-HybridHybrid端口是交换机上既可以连接用户主机,又可以连接其他交换机的端口。Hybrid端口既可以连接接入链路又可以连接干道链路。Hybrid端口允许多个VLAN的帧通过,并可以在出端口方向将某些VLAN帧的Tag剥掉。华为设备默认的端口类型是Hybrid。 Hybrid端口收发数据帧的规则
不同vlan同段IP通信LSW1vlan1vlan2vlan3interfaceEthernet0/0/1porthybriduntaggedvlan2to3interfaceEthernet0/0/2porthybridpvidvlan2porthybriduntaggedvlan2to3interfaceEthernet0/0/3porthybridpvidvlan3porthybriduntaggedvlan2to3
VLAN中access、Trunk和Hybrid三种端口区别:acesss:1、发送不带标签的报文2、一般与PC\server相连时使用3、只可以属于一个VLANTrunk:1、发送带标签的报文2、一般用于交换机级联端口传递多组VLAN信息使用3、可以属于多个VLANHybrid:1、混合端口可以同时属于多个vlan2、混合端口
这系列文章内容包括:STP、RSTP、MSTP、VLAN、LACP、SuperVLAN。以学习实验配置为主要目标;实验引用华为官方na在线视频中实验。6.3VLAN原理和配置实验截图:配置第一个交换机:修改端口类型acc、配置端口所属vlan、配置trunk端口。实验心得:有一个问题,当你配置e0/0/3为trunk以及al
实验一:交换机端口类型配置1.拓扑图如下图所示:2.实验要求:实现二层网络中工程部和市场部不能互访,但是都能与网络中心的服务器通信3.请写出你的配置思路、配置命令实验思路:将交换机SW1、SW2、SW3之间配置为trunk链路,其他接口配置为Hybrid链路;实验配置名如下:SW1sysnameSW
   这个英文材料对我一个英语一般的学生表示亚历山大啊,不过还是勉强看完了,说说自己的看法吧。   谷歌作为一家商业公司,利润是其基本的追求目标,这一点是毋庸置疑的。但是谷歌并没有被这个基本目标挡住了视野,无数公司失败的经验告诉我们,如果缺少创新,公司的一切发展
简介:VLAN10内通信,VLAN20内通信,VLAN30与VLAN10、VLAN20、VLAN30皆可通信Hybrid接口应用拓扑图:  一、配置PC机ip并测试相互能否ping通 PC名称IP子网掩码网关PC110.1.1.1255.255.255.010.1.1.254PC210.1.1.2255.255.255.010.1.1.254PC310.1.1.3
通常情况下,公司对内网的使用远远高于对外网的使用。公司的内部网络是由二层交换网络构建的,所以二层网络设计的好坏直接影响公司的正常业务。好的设计不仅使功能得到体现,还可以应对一些未知的隐患,如线路损坏、设备损坏等。下面我们主要对华为的二层设备进行了解,不过首先要了解的就
手机app代表了互联网时代的发展,促使我们的日常生活也变得越来越轻松,不管是哪个行业或者企业,在人们手机上存在最多的还是APP,手机APP逐渐的超越了网络,本身这些APP系统就是一个大型的APP系统,具体APP怎么开发呢?开发出来的手机APP,主要还是通过编程的方式设计出来的,有了变成那么就需要程
我想导出一种简单可靠的方法来自动提升正在运行的批处理,而无需使用其他线程中建议的额外的VBS文件或提升的快捷方式.通过javascript从批处理调用UAC对话框可确保简短的简单代码.在对话框中选择“是”,但错误对话框弹出时(在Cmd窗口外部)“Windows找不到’test.bat’”,下面的脚
无论如何,我可以在FORTRAN程序中使用BoostGraphLibrary(BGL)来使用图形数据结构.任何人都可以帮助我或给我一个提示.我想在我的MPI-FORTRAN代码中的几个处理器上进行并行图结构.是否可以使用BoostGraphLibrary(BGL)来达到此目的!亲切的问候,谢夫解决方法:你必须构造一个用C语
原文链接:http://www.cnblogs.com/iamzyf/p/3515889.html其实问题很简单:我的产品页面在 http://www.gdtsearch.com/products.spiderstudio.docapi.htm,这是一个静态页面;而我所有的技术博客都在博客园中.为了让访问者能够直接在产品页面中看到我最
Hybrid接口是华为特有的一种接口Hybrid接口是既可以连接普通终端的接入链路,又可以连接交换机间的干道链路。简单说就是Hybrid接口既能实现Access的功能又能实现Trunk接口的功能。实验模拟:实验拓扑:实验编址:测试连通性:查看交换机接口类型(默认情况下都是hybrid类型)displayportvlan
原生APP开发-NativeApp:需要用户下载安装使用,可访问手机的所有功能(GPS,摄像头,重力加速器),拓展性强,是专门为某种操作系统开发的(IOS,Android,黑莓等),但是开发和维护的成本都比较高 webApp:html5语言写出的app,不需要下载安装,基本上就是触屏版的网页,可以在多个设备上运行,有很大的局限性
拓扑图如下:(1)sw1的配置:<Huawei><Huawei>system-view//切换到系统视图Entersystemview,returnuserviewwithCtrl+Z.[Huawei]sysnamesw1//配置主机名Oct25201916:29:31-08:00sw1DS/4/DATASYNC_CFGCHANGE:OID1.3.6.1.4.1.2011.5.25.191
程序员常用等宽字体1SourceCodePro2CourierNew(传统)3Consolas4Monaco5中文雅黑混合版(YaHeiConsolasHybrid)
Japan'shybridmodelinventoryofhairEwhaRinkaLead:passed37thbirthdayofthepear,theeyesofeveryonestillhasaLolita-likegirltemperament,herinterpretationoftheinvolutionBOBlongghdhairstraightener hair,andevensetoffinas
1url不要用hash模式,如果涉及到外部如firebase方式直接发送给客户端动态链接,要求打开app内h5地址的时候,这个#会被截断,客户端无法解析2尽量在多页面,当客户端由不同入口进入的时候,前端尽可能做多业务拆分,避免以后所有模块在一起,一次修改要全部上线,3移动端输入框键盘要求输