从微信JS-SDK认识JSBridge

2024-01-20
来源:网络整理

前言

前段时间,为了实现H5移动端拉取微信卡包并同步卡包数据的功能,项目中引入了**`微信JS-SDK()`**[1]相关包实现了该功能,但是也是由它实现的,这让我很好奇,所以我打算进一步了解一下相关内容,通过查阅相关资料发现这其实是一种实现方法。

所以,只要看懂了,你就能明白微信JS-SDK是怎么回事了。

.jpg 为什么需要它?

相信大多数人都有同样的经历。 他们第一次了解到它是从微信JS-SDK()中。 当然,如果你是从事应用或者-开发的,我相信你自然(应该、会)会非常了解。

其实它已经出现并实际使用了很长时间,比如早期桌面应用的消息推送。 在移动终端盛行的时代,越来越需要****,因为我们期望移动终端(应用程序或-)能够做更多的事情,包括利用客户端原生功能来提供更好的交互和服务。

但它无法直接调用不同语言(如Java、C/C++等)提供的功能特性,因此需要一个中间层来实现与其他语言的相互协作。 这里以Node架构来进行说明。

节点架构

核心内容如下:

中间层节点

底层V8+

这里不难发现Node有一些类似的功能,所以它本身是一个非常简单的东西,更多的是一种形式和一种思想。

为什么叫它?

联合创始人Jeff在他2007年的博客《The of [2]》中认为“任何可以用编写的应用程序,比如网页、APP、小程序、后端等,以及各种相关生态正在变得越来越多”更加丰富。

作为Web技术的逻辑核心,它自然需要承担与其他技术“桥接”的责任,而任何移动操作系统都会包含一个运行的容器环境,比如等等,这意味着运行不需要同样的环境。与运行其他语言一样。 另外添加相应的运行环境。

由于微信的出现,该应用程序在中国变得非常流行。 当时微信的主要功能之一就是通过网页分享内容。

可以做什么?

举个最常见的前端和后端的例子。 后端仅提供搜索接口,不提供更新接口。 所以对于前端来说,是没有办法实现更新接口的!

同样,能做什么也取决于原生端提供的调用函数的接口。 例如,通过微信JS-SDK,网页开发者可以通过微信使用拍照、选图、语音、位置等手机系统功能,也可以直接使用微信。 微信的独特功能包括分享、扫码、优惠券和支付。

作为内外之间的桥梁,表面上允许调用功能,但其核心是建立内外消息的双向沟通​​通道。

双向通信通道:

发送消息至:

它是如何实现的?

的运行需要JS引擎的支持,包括V8、等,总之,运行环境与原生运行环境天然隔离。 因此,在设计时,我们可以类比一下这个过程:

调用有两种实现方式,如下:

在开始分析具体内容之前,还是有必要先了解一下前提知识。

它是什么?

它是本机系统用来将移动应用程序嵌入到 Web 中的技术。 它内置高性能内核浏览器,通常封装为SDK中的组件。

除了通用的View属性和设置外,还增强了URL请求、页面加载、渲染、页面交互等功能,提供更强大的功能。

优点是当页面布局需要更新或者业务逻辑发生变化时,可以更方便地提供APP更新:

在微信小程序中

小程序的主要开发语言是逻辑层和渲染层分离,分别运行在不同的线程中,渲染层运行在:

运行环境 逻辑层 渲染层

iOS系统

安卓

微信支付页面小程序_微信小程序支付模块教程_微信小程序webview支付

V8

定制内核

小程序开发者工具

西北地区

.jpg

开发过程中遇到的坑之一是:

通话-实施方案一

通过调用,会分为:

【注射原料药】

核心原则:

这里我们不介绍iOS和注入方法。 有兴趣的话可以自己查一下资料。 我们直接通过**微信JS-SDK**来看一下[3]。

.gif

通过引入JS-SDK后,就可以在页面中使用微信相关的API了,例如:

// 微信授权
window.wx.config(wechatConfig)

// 授权回调
window.wx.ready(function () {...})

// 异常处理
window.wx.error(function (err{...})

// 拉起微信卡包
window.wx.invoke('chooseInvoice', invokeConf, function (res{...})
复制代码

如果看它内部编译打包的代码(简化版),其实不难发现:

!(function (e, n{
  'function' == typeof define && (define.amd || define.cmd)
    ? define(function () {
        return n(e)
      })
    : n(e, !0)
})(thisfunction (e, n{
   ...
   function i(n, i, t) {
    e.WeixinJSBridge
      ? WeixinJSBridge.invoke(n, o(i), function (e{
          c(n, e, t)
        })
      : u(n, t)
   }
   
   if (!e.jWeixin) {
    
    var N = {
        config(){
          i(...)
        },
        ready(){},
        error(){},
        ...
    }
    
    return (
      S.addEventListener(
        'error',callback1,
        !0
      ),
      S.addEventListener(
        'load',callback2,
        !0
      ),
      n && (e.wx = e.jWeixin = N),
      N
    )
  }
})
复制代码

【劫持网址】网址是什么?

微信小程序webview支付_微信小程序支付模块教程_微信支付页面小程序

URL是一种特殊的URL,一般用于在Web上唤醒App(或者跳转到App中的某个页面)。 可以方便地在App之间互相调用(例如与微信分享消息)。

URL的形式与普通URL类似(如****)。 主要区别在于主机一般是为APP定制的。

通常一个App安装的时候,都会在系统上注册一个**自定义URL**,比如://,那么当我们在手机浏览器中访问这个地址时,系统就会调用对应的App。

例如,当您在浏览器中访问://时,浏览器会询问您是否要打开相应的APP:

劫持原理

Web端以某种方式(如.src)发送URL请求,然后拦截该请求并根据URL及其携带的参数执行相应的操作。

例如, 可以通过:///、://-urls/、:///来定位不同的页面内容。 假设你跳转到的设置页面,期望当前的搜索引擎改为百度,你可以这样设计:///?=&=:

以上只是一个假设。 这并不意味着真的可以通过这种方式修改 。 当然,如果真的支持也不是不可能。

是不是感觉流程很相似~~

[弹出窗口拦截]

弹窗拦截核心:这是通过弹窗触发相应事件来实现的。

一般是通过拦截、拦截等方法,然后解析它们传递过来的消息。 不过这种方法的缺点是iOS中不支持,而且iOS中也有更好的方法,所以很难统一。

呼吁——实施方案二

调用方法的本质是执行字符串连接,就像我们使用eval()函数以字符串的形式执行代码一样。 不同的系统也有相应的执行脚本的方法。

需要根据版本来区分:

4.4之前的版本使用()

webView.loadUrl("javascript:foo()")
复制代码

()执行后无法得到结果。 这个方法更像是

“观看转发”就是最大的支持

分享