5分钟搞定uniapp与webview双向通信:最新uni.webview.js 1.5.6实战教程

张开发
2026/4/16 16:45:32 15 分钟阅读

分享文章

5分钟搞定uniapp与webview双向通信:最新uni.webview.js 1.5.6实战教程
5分钟搞定uniapp与webview双向通信最新uni.webview.js 1.5.6实战教程在移动应用开发中混合开发模式越来越受到青睐尤其是uniapp结合webview的方案。这种架构既能享受原生应用的性能又能实现Web页面的灵活更新。本文将带你快速掌握最新版uni.webview.js 1.5.6的双向通信实现技巧让你在5分钟内完成核心功能搭建。1. 环境准备与SDK配置1.1 获取最新版uni.webview.js首先需要从官方渠道获取最新版本的SDK文件wget https://gitcode.net/dcloud/uni-app/-/raw/dev/dist/uni.webview.1.5.6.js提示建议将文件下载到项目静态资源目录如static/js/下确保打包时能正确包含。1.2 HTML页面配置在webview加载的HTML页面中需要正确引入SDK文件!DOCTYPE html html head meta charsetutf-8 titleWebview页面/title /head body div idapp/div !-- 必须在body底部引入 -- script src/static/js/uni.webview.1.5.6.js/script /body /html关键点说明SDK必须放在/body标签前引入路径需根据实际项目结构调整确保文件加载无404错误2. 建立通信桥梁2.1 监听初始化事件当webview页面加载完成后SDK会自动触发UniAppJSBridgeReady事件document.addEventListener(UniAppJSBridgeReady, function() { console.log(通信桥梁已建立); // 获取当前环境信息 uni.getEnv(function(res) { console.log(运行环境:, res.platform); }); });2.2 可用API概览uni.webview.js 1.5.6提供了丰富的API方法方法名描述平台支持navigateTo跳转页面全平台redirectTo重定向页面全平台postMessage发送消息非H5getEnv获取环境部分平台3. 实现双向通信3.1 Webview向Uniapp发送消息在webview页面中可以通过以下方式发送消息// 方式1使用postMessage API uni.postMessage({ data: { type: userAction, payload: clickedButton } }); // 方式2通过webView实例 uni.webView.postMessage({ data: 自定义消息内容 });在uniapp中接收消息// pages/index/index.vue export default { onLoad() { const currentWebview this.$scope.$getAppWebview(); currentWebview.addEventListener(postMessage, (e) { console.log(收到消息:, e.detail.data); }); } }3.2 Uniapp向Webview发送消息uniapp端可以通过evalJS方法执行webview中的JS代码// 获取当前webview实例 const webview this.$scope.$getAppWebview(); webview.evalJS(receiveDataFromApp(JSON.stringify(data)));webview页面需要预先定义接收函数// 全局定义接收函数 window.receiveDataFromApp function(data) { console.log(来自App的数据:, data); // 处理业务逻辑... }4. 跨平台兼容方案4.1 H5环境的特殊处理在H5环境下可以使用标准的postMessageAPI// webview页面发送消息 window.parent.postMessage({ type: fromWebview, data: payload }, *); // uniapp页面接收 window.addEventListener(message, (event) { if(event.data.type fromWebview) { // 处理消息 } });4.2 统一封装方案建议封装一个跨平台的通信工具类// utils/webviewBridge.js export default { send(data) { if(uni.getSystemInfoSync().platform h5) { window.parent.postMessage(data, *); } else { uni.postMessage({ data }); } }, receive(callback) { if(uni.getSystemInfoSync().platform h5) { window.addEventListener(message, (e) callback(e.data)); } else { document.addEventListener(UniAppJSBridgeReady, () { uni.onMessage(callback); }); } } }5. 实战案例用户登录状态同步下面通过一个典型场景演示双向通信的实际应用5.1 Webview页面代码!-- login.html -- script document.addEventListener(UniAppJSBridgeReady, function() { document.getElementById(loginBtn).addEventListener(click, () { const userInfo { username: document.getElementById(username).value, token: generated_token }; // 发送登录信息给App uni.postMessage({ type: login, data: userInfo }); }); }); // 接收App的登出指令 window.receiveLogoutCommand function() { clearUserSession(); alert(您已退出登录); }; /script5.2 Uniapp端处理// App.vue export default { onLaunch() { // 监听所有webview的消息 uni.onMessage((res) { if(res.type login) { this.storeUserInfo(res.data); uni.showToast({ title: 登录成功 }); } }); }, methods: { logout() { // 通知所有webview登出 getCurrentPages().forEach(page { const webview page.$getAppWebview(); webview.evalJS(receiveLogoutCommand()); }); } } }在实际项目中这种通信机制可以完美解决混合开发中的状态同步问题。记得根据业务需求适当扩展通信协议比如加入消息类型验证、数据加密等安全措施。

更多文章