深入了解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 函数调用规则
Sep 14 Javascript
写给想学习Javascript的朋友一点学习经验小结
Nov 23 Javascript
JavaScript回调(callback)函数概念自我理解及示例
Jul 04 Javascript
showModelDialog弹出文件下载窗口的使用示例
Nov 19 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
Dec 11 Javascript
js转化毫秒为时间格式代码
Apr 10 Javascript
jQuery 删除/替换DOM元素的几种方式
May 20 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
Dec 24 Javascript
js HTML5 Canvas绘制转盘抽奖
Sep 13 Javascript
详解AngularJS通过ocLazyLoad实现动态(懒)加载模块和依赖
Mar 01 Javascript
vue.js实现简单轮播图效果
Oct 10 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
Jan 18 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
谈谈新手如何学习PHP 默默经典版本
2009/08/04 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
2016/11/04 PHP
thinkPHP5框架自定义验证器实现方法分析
2018/06/11 PHP
PHP xpath()函数讲解
2019/02/11 PHP
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
javascript之typeof、instanceof操作符使用探讨
2013/05/19 Javascript
关于Javascript与iframe的那些事儿
2013/07/04 Javascript
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
js实现ArrayList功能附实例代码
2014/10/29 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
jQuery Select下拉框操作小结(推荐)
2016/07/22 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
详解ES6语法之可迭代协议和迭代器协议
2018/01/13 Javascript
VUE 全局变量的几种实现方式
2018/08/22 Javascript
vue如何根据网站路由判断页面主题色详解
2018/11/02 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
微信小程序登录态和检验注册过没的app.js写法
2019/05/22 Javascript
使用Node.js在深度学习中做图片预处理的方法
2019/09/18 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
总结Python中逻辑运算符的使用
2015/05/13 Python
Python学习小技巧之列表项的推导式与过滤操作
2017/05/20 Python
python如何重载模块实例解析
2018/01/25 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
2019/02/18 Python
jupyter 导入csv文件方式
2020/04/21 Python
Python正则表达式如何匹配中文
2020/05/27 Python
html5 实现客户端验证上传文件的大小(简单实例)
2016/05/15 HTML / CSS
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
车间班组长岗位职责
2013/11/13 职场文书
聚美优品广告词改编
2014/03/14 职场文书
2015年学校食堂工作总结
2015/04/22 职场文书
python 实现体质指数BMI计算
2021/05/26 Python
Go 语言结构实例分析
2021/07/04 Golang