HyBird App(混合应用)核心原理JSBridge
app分类
- Native App(原生应用)
- Web App(网页应用)
- HyBird App(混合应用)
HyBird App(混合应用)
Hybrid利用JSBridge进行通信
优点:随时发版,不受应用市场审核限制;拥有几乎和Native一样的能力,如:拍照、存储、加日历等等...
缺点:H5有的缺点他几乎都有,比如性能差、JS执行效率低等等。
JSBridge介绍
给 JavaScript 提供调用 Native 功能的接口,让混合开发中的前端部分可以方便地使用 Native 的功能,(摄像头,地理定位...)。
让native可以调用web的js代码,让web可以调用原生的代码,实现双向的消息通信的通道,它在做native代码和js代码相互转换的事情。
双向通信的通道:
JS 向 Native 发送消息: 调用相关功能、通知 Native 当前 JS 的相关状态等。
Native 向 JS 发送消息: 回溯调用结果、消息推送、通知 JS 当前 Native 的状态等。
数据间的通讯关键是以下两点:
将Native端的接口封装成js接口
将Web端js接口封装成原生接口
总结
- js调用原生代码
- 原生调用js

优势及应用场景
- 因为Web端支持JavaScript,而Native(iOS/Android)端的Webview控件对JavaScript也有所支持,页面加载完成后调用页面的JavaScript代码。
- 通过Webview可以类似于iframe把我们的页面嵌入到原生Native中进行控制。
- 由于Webview内嵌H5的性能/功能各种受限。于是有了各种的混合开发模式(Hybrid App)混合使用Native和Web技术解决方案,例如:Hybrid、RN、WEEX、Flutter、小程序、快应用等等。
JsBridge的核心
1、Web端调用Native端代码
- 拦截Url
- URL Schema, 客户端通过拦截webview请求来完成通讯
- URL Schema(类URL的请求格式,如:
<protocol>://<host>/<path>?<query>)
- 注入API
- native向webview中的js执行环境, 注入API, 以此来完成通讯。
1.1 拦截URL Schema
当Web端要请求Native端的方法时,我们首先要自定义一个URL Schema,向Native端发起一个请求,最后在Native端的WebView进行监听。
它类似于我们常见的url,区别在于protocol域名 和 host协议 一般是自定义的
自定义通信的URL schema
jsbridge://<method>?<params>
jsbridge://showToast?text=hello&a=b
流程:web端发送URL Schame请求如(jsonp)可以携带参数,native端进行相应处理
发送URL schema请求
向Native端发起请求:
<script>
function showNativeDialog(text) {
window.alert('jsbridge://showToast?text=' + text);
}
</script>
Native端实现监听
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
if (!message.startsWith("jsbridge://")) {
return super.onJsAlert(view, url, message, result);
}
UrlSchema urlschema = new UrlSchema(message);
if ("showToast".equals(urlchema.getMethodName())) {
String text = urlschema.getParams("text");
Toast.makeText(mContext, text, Toast.LENGTH_LONG).show();
}
result.confirm();
return true;
}
}
1.2 注入api
Native端通过 WebView 提供的接口,向 JavaScript 的 Context(window)中注入对象。
在Web中通过注入的对象调用Native方法。
- 向WebView注入JS对象
创建一个JS对象,并实现监听的方法
class NativeBridge{
private Context context;
NativeBridge(Context context){
this.context = context;
}
@JavascriptInterface
public void showNativeDialog(String text){
Toast.makeText(context,text,Toast.LENGTH_LONG).show();
}
}
Native端通过WebView的接口注入JS对象
webView.addJavascriptInterface(new NativeBridge(mContext),"NativeBridge");
- 通过注入的JS对象调用Native代码
Web中获取JS对象,调用Native代码
<script>
function showNativeDialog(text) {
//window.alert('jsbridge://showToast?text=' + text);
window.NativeBridge.showNativeDialog(text);
}
</script>
2、Native端调用Web端代码
WebView是Native中加载网页的一个控件,该组件提供一个evaluateJavascript()方法运行JS代码。我们要做的是在Native端执行一个js方法,在Web端进行监听
Native端
Android
mWebView.evaluateJavascript("window.showWebDialog('123')", new ValueCallback() {
@Override
public void onReceiveValue(String value) {
//这里的value即为对应JS方法的返回值
}
});
H5端
<script>
window.showWebDialog = text => window.alert(text);
</script>
HyBird App(混合应用)核心原理JSBridge的更多相关文章
- Hybird App ( 混合模式移动应用)开发初体验
最近1,2个月一直都尝试开发一款Hybird app,遇到了很多问题,谈谈自己的体会. Hybird app (混合模式移动应用),它利用例如安卓端webview组件+HTML5内嵌的方式混合的方式开 ...
- hybird app混合开发介绍
一 概念 1 Hybird App,是用现有前端(html,js,css)技术来开发的app.特点:1 灵活(开发灵活 ,部署灵活) 2 拥有类似原生的性能体验. 2 不是h5页面,也不是在webvi ...
- Hybird App 应用开发中5个必备知识点复习
前言 我们大前端团队内部 ?每周一练 的知识复习计划还在继续,本周主题是 <Hybird APP 混合应用专题> ,这期内容比较多,篇幅也相对较长,每个知识点内容也比较多. 之前分享的每周 ...
- 开发框架-APP:Hybird App
ylbtech-开发框架-APP:Hybird App Hybrid App(混合模式移动应用)是指介于web-app.native-app这两者之间的app,兼具“Native App良好用户交互体 ...
- Hybird App(一)----第一次接触
App你知道多少 一 什么是Native App 长处 缺点 二 什么是Web App 长处 缺点 三 什么是Hybrid App 长处 缺点 四 Web AppHybrid AppNative Ap ...
- Hybrid APP混合开发的一些经验和总结
http://www.cnblogs.com/kingplus/p/5588339.html 写在前面: 由于业务需要,接触到一个Hybrid APP混合开发的项目.当时是第一次接触混合开发,有一些经 ...
- 用ionic快速开发hybird App(已附源码,在下面+总结见解)
1.ionic简介 ionic 是用于敏捷开发APP的解决方案.核心思路是:利用成熟的前端开发技术,来写UI和业务逻辑.也就是说,就是一个H5网站,这个区别于react-native,native.即 ...
- Redis核心原理
Redis系统介绍: Redis的基础介绍与安装使用步骤:https://www.jianshu.com/p/2a23257af57b Redis的基础数据结构与使用:https://www.jian ...
- 关于django 京东淘宝 混合搜索实现原理
混合搜索在各大网站如京东.淘宝都有应用,他们的原理都是什么呢?本博文将为你介绍它们的实现过程. 混合搜索的原理,用一句话来说就是:关键字id进行拼接. 混合搜索示例: 数据库设计: 视频方向: 1 2 ...
随机推荐
- 在超算系统上使用sbatch提交MXNet分布式训练任务
在超算系统上运行MXNet分布式训练任务时,面临着一个IP地址相关的问题.我们在提交MXNet的分布式任务时,需要知道各个GPU节点的IP地址,把这些IP地址放到一个hosts文件中,以供分布式训练使 ...
- 从Spring容器的角度理解Dubbo扩展点的加载时机
对于Dubbo提供的扩展点,主程序执行的过程中并没有显示调用加载的过程,无论是自激活的Filter还是自适应的ThreadPool.那么这样的扩展点在程序运行的哪个节点调用的呢?跟踪之前性能监控扩展点 ...
- Spring MVC拦截器(Interceptor)使用
第一篇Spring MVC的小作文就是关于Interceptor的,而不是很多基础的东西呢,很无奈.因为实践的项目中用到了,用地不太好,导致重复跳转页面浏览器cookie溢出了. 这个过程中呢就将与I ...
- [LeetCode]1313. 解压缩编码列表
给你一个以行程长度编码压缩的整数列表 nums . 考虑每对相邻的两个元素 [freq, val] = [nums[2i], nums[2i+1]] (其中 i >= 0 ),每一对都表示解压后 ...
- 使用helm安装ingress,实现用域名的方式访问k8s内部应用
k8s集群版本 k8s集群版本是1.22 提前部署好nginx服务和创建好svc deployment方式部署的nginx服务,1个副本 创建的服务 通过服务可以代理到nginx服务 curl 10. ...
- [旧][Android] Retrofit 初步使用
备注 原发表于2016.04.13,资料已过时,仅作备份,谨慎参考 Retrofit 是什么? Retrofit is a type-safe HTTP client for Android and ...
- C语言字符串输入输出函数(gets()函数、puts()函数、fgets()函数、fputs()函数)
scanf("%s", str) 不能读取空白字符,遇到第一个空白字符就停止读取. gets(str) 读取整行输入,直至遇到换行符,丢弃换行符储存其余字符,并在末尾添加 \0.与 ...
- cpu 时间片消耗表|cpu消耗表
1秒=1000毫秒(ms)=1,000,000 微秒(μs)=1,000,000,000 纳秒(ns)=1,000,000,000,000 皮秒(ps) 1个CPU时钟周期=时钟频率 2GHz CPU ...
- 怎么查看已安装的office的序列号?ospp.vbs是什么文件
office2007查看方法:点击开始菜单→控制面板→系统和安全→系统把它往下拉.就可以看到你的序列号.也就是激活码和密匙了office2010查看方法:下载使用Product Key Finder. ...
- MySQL常用查询命令(连接查询&子查询)
多张表联合起来查询即为连接查询,可分为: 内连接:等值连接.非等值连接.自连接 外连接:右外连接.左外连接 也就是先把多张表通过某种指定条件用join...on...语法连接起来,然后再进行where ...