在 UniApp 中实现 App 与 H5 页面的跳转及通信

在移动应用开发中,内嵌 H5 页面或与外部网页交互是常见需求。UniApp 作为跨平台框架,提供了灵活的方式实现 App 与 H5 的跳转双向通信。本文将详细讲解实现方法,并提供可直接复用的代码示例。

文章目录

  • 一、 App 内嵌 H5 页面(使用 `web-view` 组件)
  • 二、 App 跳转外部浏览器打开 H5
  • 三、App 与 H5 的双向通信
  • 四、注意事项和常见问题
  • 五、完整代码示例
  • 六、总结

一、 App 内嵌 H5 页面(使用 web-view 组件)

1.核心场景

  • 在 App 内直接显示第三方活动页、帮助文档等。
  • 保持应用内导航体验,避免跳转外部浏览器。

2.实现步骤
(1)创建 web-view 页面
在 UniApp 项目中新建页面 pages/webview/webview.vue

<template><view class="webview-container">// 全屏加载H5页面<web-viewid="my-webview":src="h5Url"@message="handleH5Message"></web-view></view>
</template><script setup>
import { ref } from 'vue';const h5Url = ref('');onLoad((options) => {// 接收跳转时传递的 URL 参数if(options.url){h5Url.value = decodeURIComponent(options.url);uni.setNavigationBarTitle({ title: options.title || '加载中...'});} else{uni.showToast({ title: '页面参数错误', icon: 'none' });setTimeout(() => uni.navigateBack(), 1500);}
});// 接收 H5 页面发送的消息
const handleH5Message = (e) => {console.log('收到 H5 消息:', e.detail.data);// 示例:根据消息关闭页面if(e.detail.data.action === 'close') {uni.navigateBack();}
}
</script>

(2)跳转到 H5 页面
在需要跳转的地方调用:

// 示例:在按钮点击事件中跳转
const openH5Page = () => {const targetUrl = 'https://www.example.com/h5-page';uni.navigateTo({url: `/pages/webview/webview?url=${encodeURIComponent(targetUrl)}&title=活动页`})
}

二、 App 跳转外部浏览器打开 H5

1.核心场景

  • 用户协议、隐私政策等需脱离应用环境的页面
  • 调用第三方支付、地图等外部服务

2.实现代码

const openExternalBrowser = (url) => {// 判断平台:App 端使用 plus.runtime, H5 端使用 window.openconst platform = uni.getSystemInfoSync().platformif(platform === 'android' || platform === 'ios'){plus.runtime.openURL(url);} else {window.open(url, '_blank');}
}// 调用示例
openExternalBrowser('https://www.example.com/external-page');

三、App 与 H5 的双向通信

1. H5 向 App 发送消息
(1)H5 页面代码
在 H5 页面中,通过 uni-postMessage 发送消息:

<!DOCTYPE html>
<html>
<body><button onclick="sendMessageToApp()"> 发送消息给 APP</button><script>function sendMessageToApp() {// 发送消息给 UniAppuni.postMessage({data: {action: 'close',message: '用户点击了关闭按钮'}})}</script>
</body>
</html>

(2)UniApp 接收消息
web-view 组件中监听 @message 事件:

<web-view:src="h5Url"@message="handleH5Message"
></web-view>

2. App 向 H5 发送消息
(1)UniApp 调用 H5 方法
通过 evalJS 执行 H5 页面的代码

// 获取 web-view 上下文(需指定 web-view 的 id)
const webViewContext = uni.createWebViewContext(my-webview);// 调用 H5 页面中的函数
const sendMessageToH5 = () => {webViewContext.evalJS(handleAppMessage('Hello from App!'))
}

(2)H5 页面接收消息
在 H5 页面中定义全局函数:

<script>// 供 App 调用的函数function handleAppMessage(msg){alert('收到 APP 消息:' + msg)}
</script>

四、注意事项和常见问题

1.跨域问题(H5端)

  • 问题:H5 页面与 UniApp 服务域名不同时,可能触发跨域限制。
  • 解决方案:
    1.配置 H5 服务端支持 CORS
    2.本地开发时,在 manifest.json 中设置代理
{"h5": {"devServer": {"proxy": {"/api": {"target": "https://api.example.com","changeOrigin": true}}}}
}

2.微信小程序特殊处理

  • 配置域名白名单:在微信公众平台设置 request 合法域名和 web-view 业务域名
  • 强制 HTTPS:所有 H5 链接必须使用 HTTPS

3.页面返回逻辑
处理 Android 返回键和导航栏返回按钮

// 监听 Android 返回键
uni.onBackPress(() => {uni.showModel({title: '提示',content: '确定要离开当前页面吗?',success: (res) => {if(res.confirm){uni.navigateBack();}}});return true; // 阻止默认返回行为
})

五、完整代码示例

1. UniApp 项目结构

src/├── pages/│   └── webview/│       └── webview.vue   # web-view 容器页面└── utils/└── bridge.js         # 封装通信工具

2.通信工具封装(bridge.js)

// 封装通信方法
export const H5Bridge = {// 发送消息到 H5sendToH5: (message) => {const webViewContext = uni.createWebViewContext('h5-container');webViewContext.evalJS(`handleAppMessage(${JSON.stringify(message)})`)},// 接收 H5 消息onH5Message: (callback) => {uni.$on('h5-message', callback);}	
}

六、总结

通过 web-view 组件和 uni.postMessage/evalJS, UniApp 实现了 App 与 H5 页面的无缝跳转和双向通信。关键点总结:

  1. 内嵌 H5:保持应用内体验,适合常规内容展示
  2. 外部跳转:适合需要调用系统能力的场景(如支付)。
  3. 通信机制:通过消息事件和 JS 执行实现双向交互

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/903271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot 实现敏感信息脱敏

记录于2025年4月28号晚上--梧州少帅 1. 定义枚举类&#xff1a; public enum DesensitizeType {NAME, EMAIL } 2. 创建自定义注解&#xff1a; 用于标记需要脱敏的字段及其类型。 Retention(RetentionPolicy.RUNTIME) JacksonAnnotationsInside JsonSerialize(using Desen…

SNMP协议之详解(Detailed Explanation of SNMP Protocol)

SNMP协议之详解 一、前言 SNMP&#xff0c;被形象地喻为网络世界大的工具箱&#xff0c;使他们能的“智慧守护者”&#xff0c;它为网络管理员装备了一套功能强够实现对网络设备状态的实时监控、性能数据的全面收集、远程配置的灵活管理以及故障事件的即时响应。借助SNMP&…

SpeedyAutoLoot

SpeedyAutoLoot自动拾取插件 SpeedyAutoLoot.lua local AutoLoot CreateFrame(Frame)SpeedyAutoLootDB SpeedyAutoLootDB or {} SpeedyAutoLootDB.global SpeedyAutoLootDB.global or {}local BACKPACK_CONTAINER BACKPACK_CONTAINER local LOOT_SLOT_CURRENCY LOOT_SLOT…

xe-upload上传文件插件

1.xe-upload地址&#xff1a;文件选择、文件上传组件&#xff08;图片&#xff0c;视频&#xff0c;文件等&#xff09; - DCloud 插件市场 2.由于开发app要用到上传文件组件&#xff0c;uni.chooseFile在app上不兼容&#xff0c;所以找到了xe-upload&#xff0c;兼容性很强&a…

Golang|外观模式和具体逻辑

最终返回的是Document的切片&#xff0c;然后取得Bytes自己再去做反序列化拿到文档的各种详细信息。 外观模式是一种结构型设计模式&#xff0c;它的目的是为复杂的子系统提供一个统一的高层接口&#xff0c;让外部调用者&#xff08;客户端&#xff09;可以更简单地使用子系统…

2025年3月AGI技术月评|技术突破重构数字世界底层逻辑

〔更多精彩AI内容&#xff0c;尽在 「魔方AI空间」 &#xff0c;引领AIGC科技时代〕 本文作者&#xff1a;猫先生 ——当「无限照片」遇上「可控试穿」&#xff0c;我们正在见证怎样的智能革命&#xff1f; 被低估的进化&#xff1a;开源力量改写游戏规则 当巨头们在AGI赛道…

可解释人工智能(XAI):让机器决策透明化

在人工智能&#xff08;AI&#xff09;技术飞速发展的今天&#xff0c;AI 系统已经广泛应用于金融、医疗、交通等多个关键领域。然而&#xff0c;随着 AI 系统的复杂性不断增加&#xff0c;尤其是深度学习模型的广泛应用&#xff0c;AI 的“黑箱”问题逐渐凸显。AI 系统的决策过…

【Go语言】ORM(对象关系映射)库

github.com/jinzhu/gorm 是 Go 语言中一个非常流行的 ORM&#xff08;对象关系映射&#xff09;库&#xff0c;用于简化与关系型数据库的交互。以下是关于它的关键信息&#xff1a; 核心特点 全功能 ORM 支持主流数据库&#xff1a;MySQL、PostgreSQL、SQLite、SQL Server 等。…

大数据企业实验室管理的痛点 质检LIMS系统在大数据企业的应用

在数字化转型浪潮中&#xff0c;大数据企业正面临海量数据管理与质量控制的双重挑战。实验室作为数据生产的核心环节&#xff0c;其检测流程的规范化、数据处理的智能化直接关系到企业数据资产的可靠性。质检LIMS&#xff08;实验室信息管理系统&#xff09;通过整合实验室资源…

在Arduino U8g2库中显示中文的方法

U8g2库支持中文显示&#xff0c;但需要手动添加中文字体或使用内置的有限中文字符。以下是具体实现方法&#xff1a; 方法一 使用U8g2内置的中文字体&#xff08;不推荐&#xff09; 缺点&#xff1a;内置字体支持的汉字较少&#xff0c;可能无法显示所有需要的字符。不推荐。…

自动驾驶分级

一、美国 SAE J3016 Taxonomy and Definitions for Terms Related to Driving Automation Systems for On-Road Motor Vehicles(2021) 1、驾驶自动化级别&#xff08;Levels of Driving Automation&#xff09; 共分为 6 个级别&#xff0c;从 无自动化&#xff08;0&#…

工业园区工厂企业数字IP广播应急呼叫对讲系统:数字IP广播极大提升工厂企业管理效率与应急响应效能

工业园区工厂企业数字IP广播应急呼叫对讲系统:数字IP广播极大提升工厂企业管理效率与应急响应效能 北京海特伟业科技有限公司任洪卓发布于2025年4月28日 在数字化转型浪潮下&#xff0c;IP应急广播呼叫对讲广播系统凭借其网络化、智能化、融合化、多元化等优势&#xff0c;已…

DNS主从同步及解析

DNS 域名解析原理 域名系统的层次结构 &#xff1a;DNS 采用分层树状结构&#xff0c;顶级域名&#xff08;如.com、.org、.net 等&#xff09;位于顶层&#xff0c;下面是二级域名、三级域名等。例如&#xff0c;在域名 “www.example.com” 中&#xff0c;“com” 是顶级域名…

再看 BBR 到 BBRv3 的公平性改进

从看一篇论文开始&#xff1a;Performance Evaluation of TCP BBRv3 in Networks with Multiple Round Trip Times&#xff0c;结论比较悲观&#xff1a; 虽然 BBRv2/3 试图解决 BBRv1 的公平性问题&#xff0c;但结果依旧不够理想&#xff0c;BBR 的迭代依旧任重而道远。 BB…

locust压力测试

安装 pip install locust验证是否安装成功 locust -V使用 网上的教程基本上是前几年的&#xff0c;locust已经更新了好几个版本&#xff0c;有点过时了&#xff0c;在此做一个总结 启动 默认是使用浏览器进行设置的 # 使用浏览器 locust -f .\main.py其他参数 Usage: locust […

优先队列和单调队列(双端队列实现的)

这里写自定义目录标题 一、优先队列与单调队列二、优先队列2.1 概念2.2 增删查 判空2.3 示例代码 三、双端队列四、单调队列4.1 单调递增队列4.2 单调递减队列 一、优先队列与单调队列 二、优先队列 2.1 概念 一种特殊的队列&#xff0c;它与普通队列的主要区别在于元素的出…

如何在idea中写spark程序

在 IntelliJ IDEA 中编写 Spark 程序是一个高效且便捷的方式&#xff0c;以下是一个详细的步骤指南&#xff0c;帮助你在 IntelliJ IDEA 中创建和运行 Spark 程序。 一、环境准备 安装 Java&#xff1a; 确保已经安装了 JDK 1.8 或更高版本。可以通过以下命令检查&#xff1a;…

BERT BERT

BERT ***** 2020年3月11日更新&#xff1a;更小的BERT模型 ***** 这是在《深阅读的学生学得更好&#xff1a;预训练紧凑模型的重要性》&#xff08;arXiv:1908.08962&#xff09;中提到的24种较小规模的英文未分词BERT模型的发布。 我们已经证明&#xff0c;标准的BERT架构和…

SpringBoot启动警告:OpenJDK 64-Bit Server VM warning

问题描述 以Debug模式启动Spring boot项目之后&#xff0c;日志打印&#xff1a;OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended&#xff0c; 警告信息 解决方案&#xff1a;配置VM opt…

“该虚拟机似乎正在使用中“

当某一天打开虚拟机突然弹出"该虚拟机似乎正在使用中"。 遇到这种问题的解决方法很简单&#xff0c;出现这种问题是因为错误关闭虚拟机导致&#xff0c;当我们点击获取所有权时发现不能解决问题。这里分享一种简单的解决方法。 打开虚拟机的文件目录 找到lck文件夹下…