返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JS中bridge的原理与封装
  • 905
分享到

JS中bridge的原理与封装

2024-04-02 19:04:59 905人浏览 泡泡鱼
摘要

目录一、hybird背景介绍1、借助原生可以实现以下能力二、 我们可以看一下纯H5和 app应用之间的区别三、jsBridge 原理以及实现方式1、 javascript调用Nati

一、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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JS中bridge的原理与封装

本文链接: https://lsjlt.com/news/152821.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JS中bridge的原理与封装
    目录一、hybird背景介绍1、借助原生可以实现以下能力二、 我们可以看一下纯H5和 app应用之间的区别三、JsBridge 原理以及实现方式1、 JavaScript调用Nati...
    99+
    2024-04-02
  • JS中bridge的原理与封装实例分析
    本篇内容主要讲解“JS中bridge的原理与封装实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS中bridge的原理与封装实例分析”吧!一、hybird背景介绍一般原生app发版周期长...
    99+
    2023-07-02
  • 封装,封装的原理,Property ,s
    1,封装 ## 什么是封装 what 对外隐藏内部的属性,以及实现细节,并给外部提供使用的接口 学习封装的目的:就是为了能够限制外界对内部数据的方法 注意 :封装有隐藏的意思,但不是单纯的隐藏 python 中属性的权限分为两种:...
    99+
    2023-01-31
    原理 Property
  • js原生Ajax如何封装
    这篇文章主要介绍了js原生Ajax如何封装,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。原理及概念AJAX即“Asynchronous Ja...
    99+
    2024-04-02
  • 原生js怎么实现对Ajax的封装
    这篇文章主要介绍原生js怎么实现对Ajax的封装,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言众所周知,jquery在我们日常开发中的使用频率非常高,与js相比,我们省去了冗长的...
    99+
    2024-04-02
  • 深入浅析JAVA中封装的原理
    本篇文章为大家展示了深入浅析JAVA中封装的原理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。第一节 什么是JAVA中的封装面向对象的三大特性:封装、继承、多态。概念:将类的某些信息隐藏在类的内部,...
    99+
    2023-05-31
    java 封装 ava
  • 原生JS封装vue Tab切换效果
    本文实例为大家分享了原生JS封装vue Tab切换的具体代码,供大家参考,具体内容如下 先看效果图 使用的技术 vue,js,css3 vue组件 可以直接使用 <tem...
    99+
    2024-04-02
  • 原生js封装无缝轮播功能
    原生js封装无缝轮播插件,供大家参考,具体内容如下 说明: 这是一个使用原生js、es5语法写出的无缝轮播程序,代码中对相关api进行了封装,使得在引入该轮播js文件后,只需要在自己...
    99+
    2024-04-02
  • 如何使用原生js封装的ajax实例
    这篇文章主要为大家展示了“如何使用原生js封装的ajax实例”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用原生js封装的ajax实例”这篇文章吧。实例如...
    99+
    2024-04-02
  • vue与js中如何实现图片压缩封装
    这篇文章主要介绍“vue与js中如何实现图片压缩封装”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue与js中如何实现图片压缩封装”文章能帮助大家解决问题。全局main.js引入:// ...
    99+
    2023-06-30
  • js中如何封装选项卡
    这篇文章将为大家详细讲解有关js中如何封装选项卡,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。这个插件对应的html的结构如下<div class=...
    99+
    2024-04-02
  • 原生js如何封装自定义滚动条
    这篇文章主要介绍了原生js如何封装自定义滚动条,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。效果图:代码如下:<!doctype&nb...
    99+
    2024-04-02
  • 如何使用Require.js封装原生js轮播图
    小编给大家分享一下如何使用Require.js封装原生js轮播图,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!index.html页面:<!DOCTYPE html>...
    99+
    2024-04-02
  • JS中Promise的使用及封装方式
    目录Promise 是什么Promise 的特点Promise 的缺点Promise 的原理Promise 的方法1. Promise.prototype.then()2. Prom...
    99+
    2023-03-06
    JS中Promise的使用 JS中Promise的封装 JS中的Promise
  • 原生JS封装animate运动框架的示例分析
    小编给大家分享一下原生JS封装animate运动框架的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!如下所示:<!DOCTYPE html> <html...
    99+
    2024-04-02
  • Java 对象导向编程中的封装与继承:理解基本原则
    封装是指将数据和方法作为一个整体进行封装,以便对数据进行保护和隐藏。通过封装,我们可以控制对数据的访问,从而提高程序的安全性、可维护性和可重用性。在 Java 中,封装可以通过访问修饰符(如 private、public)来实现。 继承 ...
    99+
    2024-03-12
    封装
  • 如何使用js的闭包原理做对象封装及调用方法
    这篇文章主要为大家展示了“如何使用js的闭包原理做对象封装及调用方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用js的闭包原理做对象封装及调用方法”这...
    99+
    2024-04-02
  • mybatis自动封装的原理是什么
    MyBatis的自动封装是通过使用Java的反射机制来实现的。 MyBatis在执行查询操作时,会通过Java的反射机制,根据查询结...
    99+
    2023-10-27
    mybatis
  • Vue中Axios的封装与接口管理详解
    目录一、 Axios 的封装安装 Axios引入接口管理统一暴露接口在组件中使用补充:封装get方法和post方法总结一、 Axios 的封装 在 Vue 项目中,和后台进行数据交互...
    99+
    2024-04-02
  • 深入理解React Native核心原理(React Native的桥接(Bridge)
    在这篇文章之前我们假设你已经了解了React Native的基础知识,我们会重点关注当native和JavaScript进行信息交流时的内部运行原理。 主线程 在开始之前,我们需要知...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作