当前位置: 首页 > news >正文

React Native WebView 进阶:实现带回调函数的通讯

实现带回调的通讯

Web 端实现

在网页中,我们使用 window.callbacks 对象来注册回调函数,并将 callbackId 传递给 App:

<script>window.callbacks = {callbacks: {},register: function(successCallback, errorCallback) {const callbackId = Date.now().toString();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]; // 执行后删除回调}},};function sendMessageToApp(message) {const callbackId = window.callbacks.register((data) => console.log('Success:', data),(error) => console.log('Error:', error));window.ReactNativeWebView.postMessage(JSON.stringify({ callbackId, message }));}
</script>
App 端实现

在 React Native 中,我们接收 Web 发送的消息,并根据 callbackId 返回结果:

import React, { useRef } from 'react';
import { WebView } from 'react-native-webview';
import { Button } from 'react-native';const MyWebView = () => {const webViewRef = useRef(null);const onMessage = (event) => {const { callbackId, message } = JSON.parse(event.nativeEvent.data);// 模拟处理操作并返回结果const result = `Processed: ${message}`;const script = `window.callbacks.execute('${callbackId}', 'success', ${JSON.stringify(result)});`;webViewRef.current.injectJavaScript(script);};return (<WebViewref={webViewRef}source={{ uri: 'https://example.com' }}onMessage={onMessage}style={{ flex: 1 }}/>);
};export default MyWebView;
解释
  1. Web 端:使用 register 方法注册成功和失败回调,并将 callbackId 通过 postMessage 传递给 App。

  2. App 端:在接收到消息后,根据 callbackId 处理数据,然后通过 injectJavaScript 调用 Web 端的 execute 方法来执行相应的回调。

http://www.lryc.cn/news/481193.html

相关文章:

  • 【设计模式】结构型模式(四):组合模式、享元模式
  • 分布式数据库中间件mycat
  • 放大电路中的反馈 > 负反馈 > 四种组态 > 虚断和虚短
  • STM32F405RGT6单片机原理图、PCB免费分享
  • 大语言模型鼻祖Transformer的模型架构和底层原理
  • GB/T 43206—2023信息安全技术信息系统密码应用测评要求(五)
  • 深度学习:BERT 详解
  • 智能的编织:C++中auto的编织艺术
  • 订单分库分表
  • 【温度表达转化】
  • 封装一个web Worker 处理方法实现多线程
  • unity3d————屏幕坐标,GUI坐标,世界坐标的基础注意点
  • MySQL基础-单表查询
  • Web安全之SQL注入---基础
  • MongoDB笔记03-MongoDB索引
  • Docker基础(一)
  • 解决 IntelliJ IDEA Maven 项目 JDK 版本自动变为 1.5 的问题
  • SDL事件相关
  • 探索App Intents:让你的应用与Siri无缝互动的新方式
  • 冒泡排序法
  • MATLAB 将fig格式另存为可编辑的eps格式,但乱码问题解决
  • Hadoop:单节点配置YARN
  • 【前端】Svelte:组件间通信
  • 数学建模-----假设性检验引入+三个经典应用场景(三种不同的假设性检验类型)
  • Unity——对RectTransform进行操作
  • 使用jmeter查询项目数据库信息,保存至本地txt或excel文件1108
  • ubuntu 22.04 server 安装 mysql 5.7.40 更改 datadir 目录 LTS
  • 网站架构知识之Ansible进阶2(day023)
  • Java 中的 Function:让转换逻辑更灵活
  • 10. java基础知识(下)