uniapp 和 webview 之间的通信

1.UniAppJSBridgeReady :


这个是在引入webview的SDK之后,当webview页面被加载完成之后会触发,该事件触发表示着uniapp和webview之间的桥成功搭建,uni对象被成功的注入到当前H5的上下文中。
我们在index.html文件中将SDK引入,这里的SDK引入必须放在body标签下面。

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    ...
  </head>
  <body>
    <noscript>
      <strong>Please enable JavaScript to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
  <!-- uni 的 SDK -->
  <!-- 需要把 uni.webview.1.5.6.js 下载到自己的服务器
    https://gitcode.net/dcloud/uni-app/-/raw/dev/dist/uni.webview.1.5.6.js
 -->
  <script type="text/javascript" src="https://gitee.com/jqn-room/public-files/blob/master/app%E4%B8%8Eh5%E9%80%9A%E4%BF%A1%E3%80%90web-view%E3%80%91/sdk/uni.webview.js"></script>
  <script>
    document.addEventListener('UniAppJSBridgeReady', function() {
      uni.webView.getEnv(function(res) {
        console.log('当前环境:' + JSON.stringify(res));
      });
      // uni.webView.navigateTo(...)
    });
  </script>
</html>
2: webview中可用的 uni API

3: sdk 插件js文件
4: h5向app传信息

    在需要向app传递信息的h5页面中,使用sdk进行信息传递

  h5.vue



    
onLoad(option) {
    postMessageWebview() // 在当前h5页面向app发送请求
},
methods: {
      postMessageWebview() {
        let webUrl = `${Config.inviteH5}operate_activity/online_model_exam/apply_model_exam?linkId=${this.linkId}mockNo=${this.mockNo}`
        // APP内通过web-view嵌入的h5 向app做通信,传递消息页面
        // webUni 是sdk的全局遍历,里面封装了很多方法
        if (webUni && webUni.postMessage) {
          console.log("发送消息给 UniApp活动首页");
          let summaryCont = ['紧急,参加万人模考,中考丢分风险降降降!!!', '真哥们才通知你,快来参加陕西中考万人模考大赛,我们一起并肩上高中!']
          // 生成1或2的随机整数
          let randomNumber = Math.floor(Math.random() * 2) + 1;
          
          webUni.postMessage({
            data: {
              action: 'activeShareUrl',
              path: webUrl,
              imageUrl: 'https://wwxq.wanweiedu.com/static/share_logo1.png',
              summary: '二轮复习前不模考=中考埋雷!', // summaryCont[randomNumber - 1],
              title: "陕西万人模考实时PK榜启动!",
            }
          });
        } else {
          console.error('uni.postMessage is not a function');
        }
      }
   }
5:app页面接收h5传递的消息

app接收信息的路由页面

<template>
     <web-view class="webViewBox" :fullscreen="false" @message="handleMessage" :src="adInfo.link"></web-view>
</template>
<script>
  export default {
    methods: {
        handleMessage(event) {
              // uni.showToast({
          //   title: '接收到 H5 页面的消息',
          //   icon: 'none'
          // })
          console.log("接收到 H5 页面的消息:", event.detail.data); // 检查消息

          const message = event.detail.data[0];
          // const { action, path } = event.data;
          // const { action, path } = event.detail.data;
          console.log("最终传输 页面的参数:" + this.urlResetFun(message.path, 'navigate'))
          if (message.action === 'navigate') {
            // 跳1: 转到指定的 UniApp 页面
            uni.reLaunch({
              url: this.urlResetFun(message.path, 'navigate')
            });
          }
          if (message.action === 'switchTabPrepareExam') {
            // 跳1: 跳转到指定tabBar页面【备考规划学】
            uni.switchTab({
              url: message.path
            });
          }
          // 2: 返回app首页
          if (message.action === 'activeBack') {
            // 跳转到指定的 UniApp 页面
            uni.reLaunch({
              url: message.path
            });
          }
          // 3:分享嵌入的当前h5路由页面
          if (message.action === 'activeShareUrl' || message.action === 'reportShareUrl' || message.action === 'rankShareUrl') {
            this.shareImageUrl = message.imageUrl
            this.shareUrl = message.path
            this.shareTitle = message.title,
            this.shareSummary = message.summary
            this.creatViewNvMask();
          }
        }
    }
  }
</script>

参考链接:uniapp 和 webview 之间的通信_uniapp webview通讯-CSDN博客
 

### UniApp WebView 实时通信方法 #### 使用 `uni.postMessage` `message` 事件实现实时通信UniApp 中,为了实现与 WebView 的实时通信,可以利用 `uni.postMessage()` 方法以及监听 WebView 组件的 `message` 事件。这使得可以从 Web 页面向 UniApp 发送消息,并且能够在 UniApp 中接收到这些消息。 对于 HTML 页面而言,确保已经引入了合适的 JavaScript 文件,例如 `uni.webview.1.5.6.js` 或者更新版本[^3]。这样做的目的是为了让 HTML 页面能够识别并执行特定于 UniApp 的 API 函数。 下面是一个简单的例子展示如何设置这种双向通信机制: #### 在 H5 (HTML/JavaScript) 页面发送消息给 UniApp 应用程序 当希望从嵌入式的网页内传递信息回宿主应用时,可采用如下方式调用 `uni.postMessage`: ```javascript // 假设这是H5页面中的JS代码 function sendMessageToUniApp(data){ uni.postMessage({ data: JSON.stringify(data), type:'customType' }); } ``` 此函数接受一个参数作为待传输的数据对象,并将其转换成字符串形式以便通过 postMessage 接口传送给上层的应用逻辑处理单元。 #### 在 UniApp 端接收来自 H5 页面的消息 要在 UniApp 中捕获上述发出的信息,则需注册相应的回调处理器来响应 `message` 事件的发生。如果是在 nvue 页面里操作的话,应该使用 `@onPostMessage` 来绑定该行为;而在普通的 vue 页面中则是 `@message` 属性: ```html <template> <!-- 如果是非nvue页面 --> <web-view :src="url" @message="handleMessage"></web-view> <!-- 若为nvue页面则应改为 --> <!--<web-view :src="url" @onPostMessage="handleNVueMessage"></web-view>--> </template> <script> export default { methods:{ handleMessage(event){ console.log('Received message from web page:', event.detail.data); const receivedData = JSON.parse(event.detail.data); // 解析JSON格式的数据 // 这里可以根据实际需求进一步处理receivedData... }, handleNVueMessage(event){ console.log('NVUE Received message from web page:',event.detail.data); const receivedData = JSON.parse(event.detail.data); // 处理数据... } } }; </script> ``` 这段模板定义了一个名为 `<web-view>` 的组件实例用于加载外部 URL 资源的同时也绑定了两个不同的事件监听器分别对应两种不同类型的 Vue/NVUE 页面结构下的消息接收场景。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值