跨端实现 DSBridge 源码解析

好奇 DSBridge 如何完成通信的,快速说明一下 DSBridge 是一个非常轻便的在 H5 实现各种客户端能力的 API 库。如果你在寻求一个混合开发的通信库,可以使用一下 github.com/wendux/DSBr...

OK,现在上图。可能有点简洁,但请跟着我走一下。

iOS 的通信方式可以采用iOSrunJavaScriptTextInputPanelWithPrompt 方法。当然 DSBridge 作者提供了多种 Webview 事件。这里用 Webview 的 prompt 事件做案例。 H5 发送 prompt 事件(浏览器原生事件)。Webview 监听了这一事件传给 iOS。iOS 处理完成接收。

下面一层,H5 将回调方法保留在 window 对象中,并将回调函数名放入参数中传给 iOS。iOS 在处理完原生函数后,通过 evaluateJavaScript 将参数顺带传给 H5.

非常简单,DSbridge 顺带支持了 EventQueue,注册事件等功能。

做一个客户端的 Dsbridge

个人在制作模拟器时,仿造 DSbridge 制作了类似的结构。模拟器的技术栈时 Electron,你可能需要一些 Electron 的知识以理解下方结构。

模拟器结构

其实非常简单,在渲染线程中提供一个 invoke 方法,在主线程中监听即可。

javascript 复制代码
// 渲染线程:预脚本
const dsBridge = {
  call: (method: string, data, callback) => {
    // 触发 mock-dsbridge 事件
    console.log('dsBridge call:', method, data)
    // 触发自定义事件
    ipcRenderer.invoke('dsbridge-handler', { method, data })
  },

  register: (method, callback) => {
    console.log(`dsBridge 注册: ${method}`)
    window['dsBridge_' + method] = callback
  }
}

// 暴露桥事件
contextBridge.exposeInMainWorld('_dsbridge', dsBridge)
javascript 复制代码
  // 主线程
  const someNativeFunctions = {
    'tokenSync': () => {return 'mockedToken'},
  }

  ipcMain.handle('dsbridge-handler', (event, data) => {
    // 处理来自渲染进程的 dsbridge 调用
    console.log('dsbridge handler:', data)
     // 执行原生,mock
    const payload = await someNativeFunctions[event](data)
    childWindow.webContents.executeJavaScript(`window._dsbridge.${data.method}(${JSON.stringify(payload)})`)
  })
相关推荐
风花一世月3 小时前
🛩️ 我把一段夕阳飞行做成了能按键驾驶的网页(24 秒四段航线,在线直接玩)
前端
用户11481867894844 小时前
实现一个「配置驱动」的动态表格组件(Vue + Element UI)
前端
数据掘金4 小时前
小程序分享参数在页面栈中的传递
前端
乐享qicheng4 小时前
1,自定义表单通俗理解-PC设计APP渲染
前端
为你学会写情书4 小时前
大屏适配别再只会 transform: scale 了,这套方案更稳
前端
孤独的神4 小时前
《AI 成了我的工位搭子,也成了我的焦虑来源》
前端
行者全栈架构师4 小时前
给开源 Rust 工具加一个新检查项,TRAE 帮我从想法跑到构建产物:全链路实战
前端·算法·架构
庚鑫4 小时前
iOS 27 兼容放大模式下,keyboardFrame 与 UIScreen.bounds 的坐标差异
ios·objective-c
hunterandroid4 小时前
[鸿蒙从零到一] relationalStore 高级实践:事务、迁移与敏感数据保护
前端
lcarusZZZ4 小时前
前端转型,自建新闻转播客工作流
前端