H5 与 WebView 的双向通信实现详解

微信小程序Webview与H5通信 微信小程序中频繁传递数据到H5进行渲染,且需要保证页面不刷新,此方法验证有效 阅读详情
AI摘要

在混合开发中,H5 页面与原生应用通信是常见需求。本文详细介绍 H5 与 React Native WebView 双向通信机制,包括在 H5 端实现回调管理器处理与原生端通信,还给出 H5 端和 React Native 端完整实现、使用示例以及通信流程图解。

背景介绍

在混合开发中,H5 页面与原生应用的通信是一个常见需求。本文将详细介绍如何实现 H5 与 React Native WebView 之间的双向通信机制。

核心实现

首先,我们需要在 H5 端实现一个回调管理器,用于处理与原生端的通信:

1. H5 端完整实现

// 回调管理器
window.NativeCallbacks = {
  callbacks: {},
  
  register: function(type, successCallback, errorCallback) {
    const callbackId = type + Date.now().toString();
    
    // Promise方式
    if (!successCallback && !errorCallback) {
      const promise = new Promise((resolve, reject) => {
        this.callbacks[callbackId] = {
          success: resolve,
          error: reject,
        };
      });
      return {
        promise,
        callbackId
      };
    }
    
    // 回调方式
    this.callbacks[callbackId] = {
      success: successCallback, 
      error: errorCallback,
    };
    return callbackId;
  },

  execute: function(callbackId, type, data) {
    const callback = this.callbacks[callbackId];
    if (callback) {
      if (type === 'success') {
        callback.success && callback.success(data);
      } else {
        callback.error && callback.error(data);
      }
      delete this.callbacks[callbackId]; // 执行后清理回调
    }
  }
};

// 原生通信接口封装
window.Native = {
  // 回调方式
  getUserInfo: function(successCallback, errorCallback) {
    const callbackId = ntalkCallbacks.register('getUserInfo', successCallback, errorCallback);
    window.ReactNativeWebView.postMessage(JSON.stringify({
      type: 'getUserInfo',
      callbackId,
      data: null
    }));
  },

  // Promise方式
  getUserInfoAsync: async function() {
    const { promise, callbackId } = ntalkCallbacks.register('getUserInfo');
    window.ReactNativeWebView.postMessage(JSON.stringify({
      type: 'getUserInfo',
      callbackId,
      data: null
    }));
    return promise;
  }
};

2. React Native 端完整实现

interface MessageData {
  type: string;
  callbackId: string;
  data: any;
}

class WebViewManager {
  private webview: WebView;

  constructor(webview: WebView) {
    this.webview = webview;
  }

  handleMessage(message: string) {
    try {
      const data: MessageData = JSON.parse(message);
      const { type, callbackId, data: payload } = data;
      
      switch(type) {
        case 'getUserInfo':
          this.handleGetUserInfo(callbackId, payload);
          break;
        case 'setAppCacheValue':
          this.handleSetAppCache(callbackId, payload);
          break;
        default:
          this.sendCallback(callbackId, 'error', '未知的消息类型');
      }
    } catch (error) {
      console.error('消息处理错误:', error);
    }
  }

  sendCallback(callbackId: string, type: 'success' | 'error', data: any) {
    const script = `
      window.ntalkCallbacks.execute(
        '${callbackId}',
        '${type}',
        ${JSON.stringify(data)}
      );
    `;
    this.webview.injectJavaScript(script);
  }

  private handleGetUserInfo(callbackId: string, payload: any) {
    try {
      // 实际项目中从本地存储或状态管理中获取
      const userInfo = {
        userId: '123',
        name: '张三',
        avatar: 'https://example.com/avatar.png'
      };
      this.sendCallback(callbackId, 'success', userInfo);
    } catch (error) {
      this.sendCallback(callbackId, 'error', error.message);
    }
  }

  private handleSetAppCache(callbackId: string, payload: any) {
    try {
      const { key, value } = payload;
      // 实际项目中进行缓存操作
      this.sendCallback(callbackId, 'success', true);
    } catch (error) {
      this.sendCallback(callbackId, 'error', error.message);
    }
  }
}

// WebView 组件使用示例
function MyWebView() {
  const webViewRef = useRef<WebView>(null);
  const webViewManager = useRef<WebViewManager>();

  useEffect(() => {
    if (webViewRef.current) {
      webViewManager.current = new WebViewManager(webViewRef.current);
    }
  }, []);

  return (
    <WebView
      ref={webViewRef}
      source={{ uri: 'https://example.com' }}
      onMessage={(event) => {
        webViewManager.current?.handleMessage(event.nativeEvent.data);
      }}
    />
  );
}

3. 使用示例

// 示例1:回调方式
Native.getUserInfo(
  (userInfo) => {
    console.log('获取用户信息成功:', userInfo);
  },
  (error) => {
    console.error('获取用户信息失败:', error);
  }
);

// 示例2:Promise方式
async function getUserData() {
  try {
    const userInfo = await ntalkNative.getUserInfoAsync();
    console.log('获取用户信息成功:', userInfo);
  } catch (error) {
    console.error('获取用户信息失败:', error);
  }
}

通信流程图解

H5原生1. 调用 Native 方法2. 注册回调函数3. 发送 postMessage4. 处理业务逻辑5. 注入回调脚本6. 执行回调并清理H5原生
5分钟搞定uniapp与webview双向通信:最新uni.webview.js 1.5.6实战教程 本文详细介绍了如何使用最新版uni.webview.js 1.5.6实现uniapp与webview的双向通信。通过实战教程,快速掌握环境配置、通信桥梁建立及跨平台兼容方案,5分钟内完成核心功能搭建,提升混合开发效率。 阅读详情

相关推荐

uniapp跨平台通信秘籍:如何在APP的webview中无缝集成H5页面并实现数据交互

本文详细介绍了如何在Uniapp中实现APP的Webview与H5页面的无缝集成与数据交互。通过环境配置、双向通信机制、高级通信模式及多平台兼容性解决方案,帮助开发者构建高效稳定的跨平台通信系统,提升移动应用开发效率。

weixin_29006187的博客 288

uniapp中微信小程序和H5相互跳转及传参(webview)

前言:在单位做项目的时候碰到一个需求,需要从微信小程序跳转到H5页面,这两个端都是使用uniapp编写的,查资料后决定使用webview来嵌入完成,然后考虑到还可能有参数(数据)需要传递,所以实现后记录一下...

blackhub的博客 1万+

Flutter 混合开发:WebView 与原生完美融合实战

在移动应用开发中,纯原生(Native)或纯Flutter开发虽能提供优质体验,但面对“高频迭代的运营活动页”“复杂H5功能复用”“多端统一维护”等场景时,混合开发(Flutter + WebView)成为更优选择。本文聚焦“Flutter与WebView的深度融合”,覆盖集成流程、双向通信实现、性能优化及跨平台适配,帮助开发者快速上手实战。本文从“为什么需要混合开发”切入,逐步讲解核心概念(Flutter、WebView、双向通信)、集成步骤、通信实现、实战案例,最后总结常见问题与未来趋势。

架构师的AI之路,分享AI应用开发架构的学习与实践。 381

小程序通过webView打开H5页面并传参(包含webView业务域名配置)、H5页面实现返回小程序并实现传参

小程序内嵌webview打开H5页面,小程序webView业务域名配置,H5接收小程序webview方式传参,H5页面实现返回小程序并实现传参,小程序接收webview页面的传参

m0_47791238的博客 1万+

uniapp 跨平台通信实战:H5与APP内webview的高效数据交互方案

本文详细介绍了uniapp中H5与APP内webview的高效数据交互方案,通过JS Bridge实现跨平台通信。文章包含核心原理、环境检测、实战步骤及性能优化,特别适用于需要H5与原生功能交互的混合开发场景,如电商支付、设备信息获取等。

weixin_29012765的博客 230

uniapp支付宝小程序与内嵌H5双向通信的实战指南

本文详细介绍了在uniapp开发的支付宝小程序中,如何与内嵌H5页面实现稳定可靠的双向通信。通过引入uni.webview.js SDK,利用postMessage和message事件完成H5到小程序的数据传递,并结合URL参数或WebViewContext实现小程序到H5的反向通信,解决了混合开发中常见的交互难题。

weixin_29008691的博客 437

web-view往h5传参及传参乱码问题

url只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号,即只有字母和数字[0-9a-zA-Z]、一些特殊符号$-_.+!*’()[不包括双引号]、以及某些保留字(空格转换为+),才可以不经过编码直接用于URL,这意味着 如果URL中有汉字,就必须编码后使用。......

m0_54788390的博客 2869

支付宝小程序与H5深度交互:实现webview内H5页面无缝跳转回小程序的实战指南

本文详细解析了在支付宝小程序Webview中实现H5页面无缝跳转回小程序的完整方案。通过动态加载JSBridge、利用my.postMessage进行数据通信,并结合my.navigateTo等API完成页面导航,解决了H5与小程序间的流程割裂问题,确保用户体验流畅。

s1t2u3的博客 900

Android WebView 与 H5 双向通信实现详解

在 Android 原生应用中,WebView 与 H5 页面的双向通信是一个常见需求。本文将详细介绍如何实现一个完整的通信方案。

weixin_42657666的博客 1984

uniapp中web-view组件实现App与H5双向通信的实战指南

本文详细介绍了uniapp中web-view组件实现App与H5双向通信的实战方法,包括URL传参和postMessage两种通信方式,以及安全校验、性能优化等进阶技巧。通过具体代码示例和项目结构解析,帮助开发者快速掌握混合应用开发中的核心通信技术,提升应用交互体验。

weixin_29001327的博客 117

uniapp与webview通信实战:5分钟搞定H5热更新与数据交互

本文详细介绍了Uniapp与WebView的深度通信实践,包括环境搭建、双向通信机制、H5热更新实现及高级数据交互模式。通过实战案例展示如何快速实现H5热更新与动态数据交互,提升开发效率和应用灵活性。

weixin_29311017的博客 124

HarmonyOS7 WebView 混合开发:原生和 H5 通信的 4 种姿势

做移动开发,纯原生的项目越来越少了。老板要快、要省钱、要热更新,H5 混合开发基本是标配。但混合开发最头疼的事就是——原生和 H5 怎么通信?H5 要调原生的支付,原生要往 H5 里塞数据,登录态怎么同步?HarmonyOS7 的 WebView 组件提供了好几种通信方式,我整理了 4 种最常用的姿势,帮你一次搞明白。H5 调原生 → javaScriptProxy(注入原生对象)原生调 H5 → runJavaScript(执行 JS 代码)

qq_37048082的博客 2997

Android进阶之路 - 通过WebView与H5前端进行完美交互

快速掌握Andorid端的混合开发技能,可在Android中调用Js方法,也可以在Js中调用Android方法,加油~

Android、前端、小程序、后端 1万+

支付宝小程序webview与uniapp H5双向通信实战:最新SDK版本配置详解

本文详细解析了支付宝小程序与Uniapp H5双向通信的最新实践,涵盖SDK配置、数据传递策略及性能优化技巧。通过实战示例展示如何实现H5到小程序的可靠通信,并分享高级调试方法,帮助开发者提升混合开发效率与用户体验。

bush的博客 681

5分钟搞懂语义通信:如何用深度学习让AI理解你的真实意图?

本文深入解析了语义通信如何利用深度学习技术,实现从传统‘比特保真’到‘语义保真’的范式转移。通过介绍基于神经网络的端到端系统架构、编解码技术及实战案例,阐明AI如何理解并高效传递信息核心意图,为6G时代的人机交互奠定基础。

weixin_29191669的博客 263

IAR许可证Generation 18代际不匹配问题解析与解决

IAR Embedded Workbench 的许可证机制采用‘代际(Generation)’模型,而非简单版本号匹配——这是一种基于数字签名算法、加密协议和硬件绑定策略演进的授权安全体系。Generation 18 是 v9.30 及以上版本强制要求的许可代际标准,对应 ECDSA 签名与增强型硬件指纹校验,旨在提升防破解能力与平台适配性。当旧版许可证(如 Generation 16/17)被用于新 IDE 时,启动器会在本地完成代际校验并直接拦截,导致‘The generation feature is

weixin_34203832的博客 344

OpenHarmony环境下React Native:WebView与H5通信

通信通道配置:确保和开启消息协议设计:使用JSON标准化数据结构,统一编码格式异常恢复机制:监听WebView进程崩溃事件并自动恢复性能优化:控制消息频率,避免阻塞主线程随着OpenHarmony 4.0对WebView内核的升级,未来可期待更完善的通信支持。WebGL在混合渲染中的性能表现Web Workers对复杂计算的卸载能力基于共享内存的高效数据传输方案完整项目Demo地址欢迎加入开源鸿蒙跨平台社区。

2501_91746149的博客 632

FreeCAD MCP实战:用自然语言驱动AI建模,效率提升10倍

MCP(Model Context Protocol)是一种让AI模型调用外部工具和数据的协议标准,通过标准化通信层解决AI与CAD软件之间的交互难题。其原理是向AI暴露工具清单,AI根据自然语言需求自动选择工具并填充参数。在工程实践中,这一技术显著降低了CAD建模门槛,将重复性操作从手动点击转为语音指令,适用于批量零件生成、参数化设计等场景。FreeCAD作为开源CAD,凭借开放的Python API和脚本化能力,成为落地MCP的理想平台。本文基于FreeCAD MCP的实操经验,分享环境搭建、自然语言建

weixin_31188927的博客 323

在自动化脚本中如何在自定义ui中使用webview来无限扩展ui?

本文探讨了在自动化脚本开发中集成WebView控件的技术方案。通过WebView可实现原生脚本与H5页面的深度交互,弥补原生UI控件的扩展性不足。文章详细介绍了WebView的核心价值、集成前提、基础实现方法,以及双向通信机制(冰狐脚本调用H5代码和H5调用原生脚本)。同时提供了性能优化技巧、错误处理方案和典型应用场景,如复杂数据展示、动态配置界面等。WebView的集成使开发者能够利用H5生态实现更灵活、更强大的自动化交互界面,为自动化脚本开发提供了无限扩展可能。

ai_coder_ai的博客 1214

V93000 SmarTest 8入门:从零搭建你的第一个半导体测试程序

半导体测试是芯片从设计走向量产的关键环节,而ATE(自动化测试设备)正是支撑这一环节的核心工具。理解ATE测试程序开发的基本原理,不仅需要掌握测试机台的硬件架构,还要熟悉其软件环境中的管脚映射、电平时序、测试流程等底层逻辑。V93000作为爱德万的主力平台,其SmarTest 8环境通过对象化与流程化设计,将复杂的芯片测试任务拆解为可配置、可复用的模块,极大提升了并行测试效率与调试的便利性。无论是数字逻辑芯片的功能验证,还是模拟混合信号器件的参数测量,掌握SmarTest 8的核心操作都能帮助你快速搭建出可

weixin_31476015的博客 240

2015年全国大学生电子设计大赛综合测评题

2015年全国大学生电子设计大赛综合测评题 题目如下: 一、555产生可调方波 555定时器是一种集成电路芯片,常被用于定时器、脉冲产生器和振荡电路。555可被作为电路中的延时器件、触发器或起振元件。 555定时器可组成单稳态电路、多稳态电路和无稳态电路。产生方波其实就是制造一个无稳态电路。 555定时器的引脚功能: 其中: DIS引脚与OUT脚电平一致 TRIG: 当此引脚电压降至1/3VCC(或由控制端决定的阈值电压)时输出端给出高电平。 THR:当此引脚电压升至2/3VCC(或由控制端决定的阈值电压

m0_47066484的博客 3万+

小程序webview嵌入uni-app搭建的h5通信及交互

本文介绍了使用uniapp搭建H5项目和小程序项目时处理web-view通信和页面跳转的方法。针对小程序web-view组件,需要注意消息传递只在特定场景触发(后退、销毁、分享)。对于H5跳转小程序页面,提供了两种SDK解决方案:微信SDK(需小程序环境)和uni-app SDK(跨环境通用)。文中详细展示了两种SDK的引入方式和使用示例代码,包括动态加载脚本、环境检测和页面跳转实现。测试结果表明uni-app SDK兼容性更好,可在任意环境下成功调用跳转方法。

q759859479的博客 577

智能驾驶感知模块的测试评估方法(上)

对于智能驾驶系统而言,感知模块是开发难度最大、投入资源最多的核心部分。在智能驾驶开发团队内部,感知模块需要独立进行评测才能及早发现潜在缺陷或判断性能是否有改进。随着近几年BEV、OCC、E2E等新技术方案被越来越多企业应用,感知的评测变得越来越艰难,效率也变得越来越低下。本文作者基于在智驾测试行业多年经验,试图总结感知评测的基本规律和效率提升方法,以供读者一些启发。

vincent_321的博客 2559

微信小程序webview和小程序通讯

1.1需要再小程序嵌入vr页面,同时在vr页面添加操作按钮与小程序进行通信交互1.3 开发工具:uniapp开发小程序1.3原型图点击体验官带看跳转小程序的体验官带看页面点击立即咨询唤起小程序弹窗打电话web-view | uni-app官网 (dcloud.net.cn)

q759859479的博客 7671

【图论】系列(七)图论的中心性度量方法及重要性评价指标

图论中的中心性度量方法是用来衡量图中各个节点(或顶点)相对重要性的指标。

qq_30066733的博客 1075

组基轨迹建模 GBTM的介绍与实现(Stata 或 R)

组基轨迹建模(Group-Based Trajectory Modeling,GBTM)(旧名称:Semiparametric mixture model)历史:由DANIELS.NAGIN提出,发表文献《Analyzing Developmental Trajectories:A Semiparametric,Group-Based Approach》GBTM能够将一群人的轨迹分类并生成数个具有代表性的运动轨迹模型,然后对每个轨迹模型进行分析,以了解人们的运动特征、生理水平和风险等级等。

三分钟热度 1万+
上一篇: React Native 集成 iOS 原生功能
下一篇: Android WebView 与 H5 双向通信实现详解
wakangda
博客等级 码龄8年 445粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值