深入了解Hybrid App技术的相关知识


Posted in Javascript onJuly 17, 2019

背景

随着Web技术的发展和移动互联网的发展,Hybrid技术已经成为一种前端开发的主流技术方案。那什么是Hybrid App呢?

Hybrid App(混合模式移动应用)是指介于web-app、native-app这两者之间的app,兼具" Native App良好用户交互体验的优势 "和" Web App跨平台开发的优势 "。

总的来说,就是既具有APP的体验和性能,又具有Web灵活的开发模式和跨平台开发能力。

现有的技术方案

1、H5 + JSBridge,通过JSBridge完成H5和Native的通信,赋予H5一定的端能力。是一种基于WebView UI的解决方案。

2、React-Native,进一步通过JSbridge将js解析为虚拟DOM传递到Native,并使用原生进行渲染。

3、小程序解决方案,采用双线程的渲染机制,将渲染层WebView和逻辑层JavaScriptCore形成独立的模块,通过Native进行通信(setData),逻辑层的网络请求也会由Native进行转发。在UI方面,采用的是WebView和原生相结合的方式。

技术原理

本文将从jsbridge的原理、实现、双向通信、接入方式和H5的嵌入方式进行详细阐述。

jsbridge的原理

客户端能对WebView中请求进行拦截,都有相应的API:

Android:

// Android: shouldoverrideurlloading 
public boolean shouldOverrideUrlLoading(WebView view, String url){
  //读取到url后自行进行分析处理
  
  //如果返回false,则WebView处理链接url,如果返回true,代表WebView根据程序来执行url
  return true;
}

IOS:

// IOS: shouldStartLoadWithRequest 
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
  NSURL *url = [request URL];
   
  NSString *requestString = [[request URL] absoluteString];
  //获取url scheme后自行进行处理

因此,在页面中可以通过iframe加载src的方式触发相应的捕获函数,在捕获函数中可以对url中的参数进行解析;此外,Android还可以通过重写OnJSPrompt方法,对调用Prompt进行拦截,同样能实现通信的目的。

示例:

调起ios端:

function iosInvoke(scheme) {
  var elem = document.createElement('iframe');
  var body = document.body || document.getElementsByTagName('body')[0];
  elem.style.display = 'none';
  elem.src = scheme;
  body.appendChild(elem);
  setTimeout(function () {
    body.removeChild(elem);
    elem = null;
  }, 0);
}

调起android端:

function androidInvoke(scheme) {
  var androidJsBridge = window.Bdbox_android_jsbridge;
  if (androidJsBridge && androidJsBridge.dispatch) {
    androidJsBridge.dispatch(scheme);
  } else {
    var re = window.prompt('BdboxApp:' + JSON.stringify({
      obj: 'Bdbox_android_jsbridge',
      func: 'dispatch',
      args: [scheme]
    }));
    return re;
  }
}

协议制定URL Scheme

URL Scheme是什么

由于苹果的app都是在沙盒中,相互是不能访问数据的。但是苹果还是给出了一个可以在app之间跳转的方法:URL Scheme。简单的说,URL Scheme就是一个可以让app相互之间可以跳转的协议。

每个app的URL Scheme都是不一样的,如果存在一样的URL Scheme,那么系统就会响应先安装那个app的URL Scheme,因为后安装的app的URL Scheme被覆盖掉了,是不能被调用的。

设置URL Scheme

xxxapp://communication?args=xx

如何进行双向通信

双向通信主要是H5和Native的双向通信过程以及参数传递、回调执行。

H5通知Native:

H5通知Native的方式主要有:

  • 调用prompt/console/alert,调用时进行参数传递,端进行拦截重写
  • URL Scheme跳转拦截,将参数放在请求URL上
  • API挂载,通过Navtive获取js执行环境,将相应的api挂载在js上,供h5调用

Native通知H5:

回调机制,在向Native传递信息时,将回调函数也传递,Native在调用完成后,使用js执行环境执行回调函数

接入方式

jsbridge的接入,端方面的jsbridge和h5方面的jsbridge

嵌入方式

h5的嵌入方式:

  • 直接代码,直接将H5代码css、html、js放入端目录下,以file协议的方式访问,优点是访问快速,缺点是迭代不方便。
  • 线上地址,以http协议访问,使用webview打开url形式,相较于代码嵌入的方式来说,速度比较慢,依赖网络传输速度;优点是迭代快速

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 网页黑白效果实现代码(兼容IE/FF等)
Apr 23 Javascript
JS 自定义函数缺省值的设置方法
May 05 Javascript
jQuery中parent()方法用法实例
Jan 07 Javascript
javascript笛卡尔积算法实现方法
Apr 08 Javascript
jQuery层次选择器用法示例
Sep 09 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
Sep 12 Javascript
vue几个常用跨域处理方式介绍
Feb 07 Javascript
vue如何引入sass全局变量
Jun 28 Javascript
详解vue2.0 资源文件assets和static的区别
Nov 27 Javascript
浅谈js中的bind
Mar 18 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
Oct 10 Javascript
Vue中nprogress页面加载进度条的方法实现
Nov 13 Javascript
Vue发布项目实例讲解
Jul 17 #Javascript
Vue项目实现简单的权限控制管理功能
Jul 17 #Javascript
百度小程序自定义通用toast组件
Jul 17 #Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
Jul 16 #Javascript
JS实现返回上一页并刷新页面的方法分析
Jul 16 #Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
Jul 16 #Javascript
微信小程序-API接口安全详解
Jul 16 #Javascript
You might like
ThinkPHP采用模块和操作分析
2011/04/18 PHP
PHP的变量总结 新手推荐
2011/04/18 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
什么是JavaScript
2009/08/13 Javascript
JS画5角星方法介绍
2013/09/17 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
使用Curl命令查看请求响应时间方法
2016/11/04 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
H5手机端多文件上传预览插件
2017/04/21 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
nodejs 日志模块winston的使用方法
2018/05/02 NodeJs
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
在vue中使用image-webpack-loader实例
2020/11/12 Javascript
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python文件处理
2016/02/29 Python
python 为什么说eval要慎用
2019/03/26 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
英国汽车和货车租赁网站:Hertz英国
2016/09/02 全球购物
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
马来西亚演唱会订票网站:StubHub马来西亚
2018/10/18 全球购物
手工制作的意大利太阳镜和光学元件:Illesteva
2019/01/19 全球购物
越南母婴用品购物网站:Kids Plaza
2020/04/09 全球购物
护理助产毕业生的求职信
2014/03/02 职场文书
工作证明格式及范本
2014/09/12 职场文书
2015年党性分析材料
2014/12/19 职场文书
Python3 如何开启自带http服务
2021/05/18 Python
利用Python判断你的密码难度等级
2021/06/02 Python
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android