菜鸟-创作你的创作

uni-app之webview通信实现方法示例

下面为你整理一份 uni-app 中 WebView 页面与原生页面/父页面通信的实现方法示例(最新版示例 + Vue3 结构),包含 3 种常用通信方式,以及 完整可复制代码


✅ uni-app 之 WebView 通信实现方法示例(超详细)

在 uni-app 中,我们可以通过 <web-view> 加载 H5 页面,而 H5 与 uni-app 通信主要有三种方式:


⭐ 方法 1:使用 postMessage(推荐)

这是 官方推荐的双向通信方式,兼容性最佳。


📌 一、父页面(uni-app)向 WebView 发送消息

父页面代码:pages/webview/webview.vue

&lt;template>
  &lt;web-view :src="url" @message="onMessage">&lt;/web-view>
&lt;/template>

&lt;script setup>
import { ref } from "vue";

const url = ref("https://example.com/test.html");

// 接收来自 H5 的消息
function onMessage(e) {
  console.log("收到 H5 消息:", e.detail.data);
}
&lt;/script>


📌 二、H5 页面(test.html)向 uni-app 发送消息

&lt;script>
function sendMsgToApp() {
  uni.postMessage({
    data: {
      msg: "hello uni-app"
    }
  });
}
&lt;/script>

&lt;button onclick="sendMsgToApp()">发送消息给uni-app&lt;/button>


📌 三、uni-app 主动发送消息给 H5

父页面使用:

const webview = this.$scope.$getAppWebview().children()[0];
webview.postMessage({ cmd: "changeColor", value: "red" });

H5 端监听:

window.addEventListener("message", function (event) {
  console.log("来自 uni-app 的消息:", event.data);
});


⭐ 方法 2:使用事件监听(plus.webview)—— App 端专用

适用于 App 端更复杂的通信(如多页面之间消息互发)。


📌 uni-app 端监听事件

const currentWebview = this.$scope.$getAppWebview();
currentWebview.addEventListener("customEvent", e => {
  console.log("收到事件:", e.detail);
});


📌 H5 向 App 派发事件

document.addEventListener("plusready", function() {
  plus.webview.currentWebview().evalJS(`
      uni.$emit('customEventFromH5', { msg: '来自H5的事件' });
  `);
});


⭐ 方法 3:JSBridge(高级方式)

适合做 深度原生扩展调用原生功能


📌 uni-app 暴露方法给 H5 调用

写在 uni-app 页面:

window.invokeFromH5 = function (data) {
  console.log("H5 调用了 APP 方法", data);
};


📌 H5 调用:

window.invokeFromH5 &amp;&amp; window.invokeFromH5("hello");


🌟 最完整双向通信案例(可直接用)

下面是一个最常用的完整通信示例:


📌 uni-app 页面:pages/webview/index.vue

&lt;template>
  &lt;view class="content">
    &lt;button @click="sendToH5">发消息给H5&lt;/button>

    &lt;web-view :src="url" @message="receiveFromH5">&lt;/web-view>
  &lt;/view>
&lt;/template>

&lt;script setup>
import { ref } from "vue";

const url = ref("/hybrid/h5/index.html");

// 接收 H5 消息
function receiveFromH5(e) {
  console.log("收到 H5 消息:", e.detail.data);
}

// 发消息给 H5
function sendToH5() {
  const webview = getCurrentPages().pop().$getAppWebview().children()[0];
  webview.postMessage({
    msg: "这是来自 uni-app 的消息"
  });
}
&lt;/script>


📌 H5:hybrid/h5/index.html

&lt;!DOCTYPE html>
&lt;html>
&lt;body>
  &lt;h3>H5 页面&lt;/h3>

  &lt;button onclick="sendToApp()">发消息给 APP&lt;/button>

  &lt;script>
    // H5 -> uni-app
    function sendToApp() {
      uni.postMessage({
        data: {
          text: "来自 H5 的消息"
        }
      });
    }

    // uni-app -> H5
    window.addEventListener("message", function (event) {
      console.log("收到来自 uni-app 的信息:", event.data);
    });
  &lt;/script>
&lt;/body>
&lt;/html>


📌 三种方法对比表

方法适用端优点缺点
postMessageApp、小程序、H5官方推荐、双向通信、最稳定不能执行 JS 代码
plus.webview仅 App功能强、可 evalJS只能 App 用
JSBridgeApp灵活可扩展需自己设计协议
退出移动版