在 uni-app
中实现 WebView 与浏览器交互 并支持 Android、iOS、HarmonyOS Next 三端兼容,是开发混合应用的关键技术之一。以下是完整的实战指南,帮助你实现 webview ↔ 原生 ↔ H5 页面
之间的通信,确保三端一致性。
📱【uni-app实战】WebView 与浏览器交互三端通用方案(Android/iOS/HarmonyOS Next)
📌 目录
- uni-app 中 WebView 的基本用法
- 页面与 WebView 通信的两种方式
- Android / iOS / 鸿蒙的兼容支持
- 案例:原生调用 H5,H5 回调原生
- HarmonyOS Next 的适配要点
- 常见问题与调试建议
- 参考链接与官方文档
1️⃣ uni-app 中 WebView 的基本用法
🔧 引入 WebView 组件(使用 <web-view>
)
<template>
<view class="container">
<web-view :src="webUrl" @message="onMessageFromWeb" />
</view>
</template>
<script>
export default {
data() {
return {
webUrl: 'https://example.com'
};
},
methods: {
onMessageFromWeb(e) {
const data = e.detail.data[0];
console.log('接收到来自 Web 页面消息:', data);
}
}
}
</script>
webUrl
: 你的网页地址(可为远程或本地)@message
: 监听来自网页的 postMessage 通信
2️⃣ 页面与 WebView 通信的两种方式
✅ H5 页面向 uni-app 页面发送消息
// 在网页中执行
window.parent.postMessage({ type: 'login', token: '123456' }, '*');
注意:H5 页面要放在允许通信的同源页面,或通过 HTTPS 使用 iframe +
postMessage
发送。
✅ uni-app 页面向 H5 页面发送数据(仅限支持 JS 注入平台)
使用 $refs
获取 webview 并通过 JS 注入调用:
<web-view ref="webview" :src="webUrl" />
// JS 注入,适用于 App 和 HarmonyOS Next
this.$refs.webview.evalJs(`window.setToken && window.setToken("abc123");`);
H5 页面需提前定义
window.setToken()
方法。
3️⃣ 各平台兼容性说明
平台 | 通信支持方式 | 特别注意 |
---|---|---|
Android (App) | ✅ postMessage + evalJs | HBuilderX 2.7+ 支持稳定 |
iOS (App) | ✅ postMessage + evalJs | 需 HTTPS 页面 |
HarmonyOS Next | ✅ ArkTS + web组件 | webview.evalJs() 完美兼容 |
微信小程序 | ❌ 无 evalJs 支持 | 仅支持单向 postMessage |
H5 | ✅ postMessage 全支持 | 需配合 iframe 与 parent.window |
4️⃣ 案例:原生调用 H5 页面函数,H5 页面回调
H5 页面代码(注入函数)
<script>
window.setToken = function (token) {
console.log('原生传来的 token:', token);
alert("收到 token:" + token);
};
// 向原生发消息
window.parent.postMessage({ action: 'loginSuccess', userId: 123 }, '*');
</script>
uni-app 页面中注入 JS
this.$refs.webview.evalJs('window.setToken("abc123")');
uni-app 接收来自 H5 的消息
<web-view :src="webUrl" @message="onMessageFromWeb" />
methods: {
onMessageFromWeb(e) {
const data = e.detail.data[0];
if (data.action === 'loginSuccess') {
console.log('用户 ID:', data.userId);
}
}
}
5️⃣ HarmonyOS Next 的适配要点(ArkTS)
HarmonyOS Next 无 WebView,而是用
web
组件,需要在 ArkTS 原生注册与处理。
📌 注册原生 Web 组件与 JSBridge
webController.runJavaScript(`window.setToken("abc123")`);
监听 H5 页面发回的消息(ArkTS):
webController.onMessage((message: string) => {
console.log('H5 回传消息:', message);
});
ArkTS 与 uni-app 桥接(推荐封装原生插件或使用 jscore 插件)
6️⃣ 常见问题与调试建议
问题 | 解决方案或建议 |
---|---|
H5 页面无法访问 JSBridge | 确保注入 JS 方法后再调用 |
H5 页面中 postMessage 无响应 | 确保页面加载完毕,且 HTTPS 环境 |
iOS 页面拦截 | 加入白名单,设置 NSAppTransportSecurity |
HarmonyOS 无法 evalJs | 使用 webController.runJavaScript() |
微信小程序不支持注入 JS | 使用组件通信或云函数 |
发表回复