JS中bridge的原理与封装

目录
  • 一、hybird背景介绍
    • 1、借助原生可以实现以下能力
  • 二、 我们可以看一下纯H5和 app应用之间的区别
  • 三、JsBridge 原理以及实现方式
    • 1、 JavaScript调用Native-注入API方式
    • 2、JavaScript调用Native-拦截URLSCHEME
    • 3、两种方式优缺点
  • 四、 现有开源解决方案
  • 五、我司使用的方案

一、hybird背景介绍

一般原生app发版周期长,而web版的app 开发速度快,周期短,所以hybird-H5 就是,web页面嵌入到app 的webview中,把Bridge作为native 与 web 页面沟通的桥梁。

1、借助原生可以实现以下能力

  • 跳转原生页面
  • 获取原生数据
  • 调用原生功能
  • 其他

二、 我们可以看一下纯H5和 app应用之间的区别

三、JsBridge 原理以及实现方式

从词意就了解到是js和Native与native之沟通的桥梁,实际上可以说是一种通信方式,而这种方式也类比于JSONP的交互方式,只是类比的对象放到了js与native身上,Native通过桥来调用js的方法,相反js通过桥也能调起native的一些功能。

1、 JavaScript调用Native-注入API方式

通过WebView提供的接口,向JavaScript的window中注入对象或者方法,让JavaScript调用时,直接执行相应的Native代码逻辑,达到JavaScript调用Native的目的。

前端执行调用方式:

ioswindow.jsSendMessage(message);
androidwindow.jsSendMessage.getNativeData()

2、JavaScript调用Native-拦截URLSCHEME

行为(应用的某个功能)
         |
scheme://[path][?query]
    |                    |
应用标识 功能需要的参数

前端的一个调用方式:

js直接请求定义好的bridge://loaded协议就能触发native端的拦截

例如:

<href="bridge://loaded" rel="external nofollow" >触发app</a>

3、两种方式优缺点

目前不建议只使用拦截URLScheme解析参数的形式,主要存在几个问题:

  • 连续调用location.href会出现消息丢失,因为WebView限制了连续跳转,会过滤掉后续的请求。
  • URL会有长度限制,一旦过长就会出现信息丢失因此,类似WebViewJavaScriptBridge,JsBridge这类库,就结合了注入API的形式一起使用

四、 现有开源解决方案

  • iOS: WebViewJavascriptBridge
  • Android: JsBridge

五、我司使用的方案

我司主要使用的是注入API方式:

  • 调用app的方法,并返回promise的结果
  • 根据当前的事件,注册成功回调,失败回调,挂载到window上
  • 针对安卓和ios, 需要兼容数据格式
  • 在根据安卓和ios判断执行不同的方法
  • Android 传送字符串
  • iOS 传送 json

代码如下: 核心逻辑如下

 if (isAndroid) {
        data = JSON.stringify(data)
        // 安卓挂载的方法
        window.JSActionBridge.handlerAction(
            event,
            data,
            successName,
            failName
        )
    }
    if (isIOS) {
   // ios挂载的方法
  window.webkit.messageHandlers.JSActionBridge.postMessage({
            method: 'handlerAction',
            data: {
                actionEvent: event,
                paramsJsonValue: data,
                successCallback: successName,
                errorCallback: failName
            }
        })
    }

注册app 调用的方法:

registerFn (fnName, fn) {
    if (typeof fnName !== 'string') {
        throw TypeError('Illegal fnName: Not an string')
    }
    if (typeof fn !== 'function') {
        throw TypeError('Illegal fn: Not an function')
    }

    window[fnName] = function (data) {
        if (isIOS) {
            fn(data)
        }
        if (isAndroid) {
            data = data || '{}'
            fn(JSON.parse(data))
        }
    }
},

注销app调用的方法:

unregisterFn (fnName) {
    if (typeof fnName !== 'string') {
        throw TypeError('Illegal fnName: Not an string')
    }
    delete window[fnName]
},

到此这篇关于JS中bridge的原理与封装的文章就介绍到这了,更多相关JS bridge内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 微信浏览器内置JavaScript对象WeixinJSBridge使用实例

    微信公众平台开始支持前端网页,大家可能看到很多网页上都有分享到朋友圈,关注微信等按钮,点击它们都会弹出一个窗口让你分享和关注,这个是怎么实现的呢?今天就给大家讲解下如何在微信公众平台前端网页上添加分享到朋友圈,关注微信号等按钮. 一.微信内置浏览器 通过 Mac 远程调试 iPhone 上微信自己的网页,我们可以发现微信内嵌浏览器定义了一个私有 JavaScript 对象:WeixinJSBridge,通过操作这个对象的相关方法可以实现分享到微信朋友圈,和判断一个微信号的关注状态以及实现关注指定

  • 微信WeixinJSBridge API使用实例

    注意:请在微信中测试 <!DOCTYPE html> <html> <head> <title>微信WeixinJSBridge API</title> <meta charset="utf-8" /> <script type="text/javascript"> (function(){ var a=document.getElementsByTagName("html

  • Android中极简的js与java的交互库(SimpleJavaJsBridge)

    前言 最近接触android中js与java交互的东西很多,当然它们之间的交互方式有几种,但是我觉得这几种交互方式都存在一定的不足,这是我决定编写SimpleJavaJsBridge这个库的关键原因. 我会按以下顺序进行本文章: 现有js与java通信方案及不足 js与java完美通信方案设计 SimpleJavaJsBridge 现在进入正题 1. 现有js与java通信方案及不足 先来说明一点js与java通信,指的是js既可以给java发送消息,同时java也可以给js发送消息.那就来屡屡

  • 微信内置浏览器私有接口WeixinJSBridge介绍

    微信网页进入,右上角有三个小点,没错,我们用到的就是它!我们只要通过将小点列表下的按钮进行自定义,就可以随心所欲的分享我们自己的内容了. 注意:(WeixinJSBridge只能在微信内打开的网页有效) 按钮一之------发送给好友 复制代码 代码如下: function sendMessage(){    WeixinJSBridge.on('menu:share:appmessage', function(argv){ alert("发送给好友"); });   } 这样,只要在

  • iOS开发之WKWebViewJavascriptBridge Xcode9中导致crash的解决

    前言 本文主要给大家介绍了关于iOS WKWebViewJavascriptBridge Xcode9中导致crash的相关解决办法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. WKWebViewJavascriptBridge 这个第三方还是比较不错的,但是最近Xcode9上,却出现了crash:WKWebViewJavascriptBridge官方github看了大家也都有如此问题,最后终于解决了: 需要在WKWebViewJavascriptBridge类里,如下修改

  • 如何通过Proxy实现JSBridge模块化封装

    最近公司在做一个项目,通过把我们自己的Webview植入第三方APP,然后我们的业务全部通过H5实现.至于为什么不直接用第三方APP WebView,主要是身处金融行业,需要做一些风控相关功能. 由于是Hybrid APP的性质,所以web与Native的通信是无法避免的:而为什么我要封装jsBridge,主要在于下面两点: 公司APP的JSBridge提供了数据的序列化和全局函数的注入,而我们这次由于包大小考虑,这一块需要H5自己来实现: 原生提供的接口协议太多,记住麻烦: 回调的写法不太人性

  • Javascript之JSBridge初探

    目录 JSBridge 的起源 JSBridge 的双向通信原理 JS 调用 Native Native 调用 JS JSBridge 的使用 总结 JSBridge 的起源 近些年,移动端普及化越来越高,开发过程中选用 Native 还是 H5 一直是热门话题.Native 和 H5 都有着各自的优缺点,为了满足业务的需要,公司实际项目的开发过程中往往会融合两者进行 Hybrid 开发.Native 和 H5 分处两地,看起来无法联系,那么如何才能让双方协同实现功能呢? 这时我们想到了 Cod

  • android和js的交互之jsbridge使用教程

    前言 众所周知,app的一些功能可能会使用到H5开发,这就难免会遇到java与js 的相互调用,android 利用WebViewJavascriptBridge 实现js和java的交互,这里介绍下JsBridge第三方库的使用. github传送门:https://github.com/lzyzsd/JsBridge  (本地下载) 简单分析 java与js相互调用如下: java发送数据给js,js接收并回传给java 同理,js发送数据给java,java接收并回传给js 同时两套流程都

  • Flutter使用JsBridge方式处理Webview与H5通信的方法

    目前,移动跨平台开发作为移动开发的重要组成部分,是移动开发者必须掌握的技能,也是自我提升的重要手段.作为Google推出的跨平台技术方案,Flutter具有诸多的优势,已经或正在被广大开发者应用在移动应用开发中.在过去的2019年,我看到越来越多的公司和个人开始使用Flutter来开发跨平台应用,对于移动应用开发来说,Flutter能够满足几乎所有的业务开发需求,所以,学习Flutter正当时. 众所周知,使用Flutter进行项目开发时,就免不了要加载H5页面,在移动开发中打开H5页面需要使用

  • 一篇文章学会jsBridge的运行机制

    目录 js调用方式 安卓 1.js调用原生 2.原生调用js ios 总结 我司的APP是一个典型的混合开发APP,内嵌的都是前端页面,前端页面要做到和原生的效果相似,就避免不了调用一些原生的方法,jsBridge就是js和原生通信的桥梁,本文不讲概念性的东西,而是通过分析一下我司项目中的jsBridge源码,来从前端角度大概了解一下它是怎么实现的. js调用方式 先来看一下,js是怎么来调用某个原生方法的,首先初始化的时候会调用window.WebViewJavascriptBridge.in

随机推荐