可以改动的option组件_uni-app WebView 组件通信

记录下 uni-app WebView 组件通信的相关问题?

项目中有需要嵌入其他 H5 的页面的业务需求。

官网的 web-view 文档中介绍还是挺简单的,但其中还有一些不必要的坑。

在社区有这样一篇帖子 在 web-view 加载的本地及远程 HTML 中调用 uni 的 API 及网页和 vue 页面通讯,浏览量已经 5w 左右,看来还是有很多人有这样的需求。

虽是一篇过时的帖子,其中 sdk 的版本也过低,已经无法使用,但是仍有参考的价值,能借鉴之前的坑。

开始的需求是在 APP 中嵌入第三方的 H5 页面。

APP 端使用

在 uni-app 中使用方法很简单。

<web-view
  v-if="srcUrl"
  :src="srcUrl"
  @message="reciveMessage"
  @onPostMessage="recivePostMessage"
>
</web-view>

直接使用 web-view 组件,将链接设置为 src

那么引入了之后如何进行通讯?这个时候就得看文档了。

<web-view> 加载的 HTML 中,添加以下代码:

// 引入 uni-app 的 sdk
<script
  type="text/javascript"
  src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"
></script>

新建一个简单 webview.html 文件,引入上面的 sdk.js 作为例子。

<!-- webview.html -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>webview</title>
  </head>

  <body>
    <div>
      <p id="messageText"></p>
      <div class="btn-list">
        <button class="btn btn-red" type="button" id="clickMe">
          点击我给 APP 传递参数
        </button>
      </div>
    </div>

    <script
      type="text/javascript"
      src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"
    ></script>
    <script type="text/javascript">
      window.jsfunction = function (data) {
        let canshutype = typeof data;
        let mes = typeof data == "object" ? JSON.stringify(data) : data;
        alert("收到参数" + canshutype);
        document.getElementById("messageText").innerHTML =
          "恭喜你,接收到你的参数n,参数是" + canshutype + "参数如下:n" + mes;
        console.log("data", data);
      };

      document.addEventListener("UniAppJSBridgeReady", function () {
        document
          .getElementById("clickMe")
          .addEventListener("click", function () {
            let data = {
              user_id: "ys123456",
              user_token: "67374b30-cac6-4efb-adc9-88231b9ac44c",
              user_info: {
                name: "Iuhuy",
                avatar:
                  "http://thirdwx.qlogo.cn/mmopen/vi_32/EURpungADj4vP3UczBVvD1DcEUt9q7WFqc6mZlSZoXoS9PyaPicnX8pjmic0rLbmwYCSa247gibINd1dWr0ic1QTvw/132",
              },
            };
            console.log("给 uni-app 发送数据", data);

            uni.postMessage({
              data: data,
            });
          });
      });
    </script>
  </body>
</html>

可以使用 npm 包 http-server 起一个本地服务。

本地起一个 server:

6cca7f2c19e0d0c1d63b6ab4ea5bd667.png

web-view 组件直接引入:

<web-view
  src="http://192.168.1.56:8081/webview.html"
  @message="reciveMessage"
  @onPostMessage="recivePostMessage"
></web-view>

手机运行点击按钮,在 HBuilderX 控制台中就能看到接收到的数据。

手机端收到的数据如下,这样是能收到数据的:

d255defc55bf703b31c49b9da1f26dd4.png

H5 端使用

上面是 APP 端的,H5 并不能收到参数。uni-app 打包成 H5 怎么接收参数呢?

开始也很纳闷,然后看了下官方的文档,web-view 组件的浏览器内核说明。

提到 H5 端的 web-view 其实是被转为 iframe 运行,使用的是当前的浏览器,那么就通过 iframe 来通讯不就好了嘛。APP 端和 H5 进行条件编译一下,分别使用不通方式:APP-webview;H5-iframe。

经验证,结果也是可行的。在需要加载链接的地方进行条件编译,分别把链接带到指定页面。

/**
  * 跳转到加载页面
  */
gotoGamePage(item) {
  // #ifdef APP-PLUS
  uni.navigateTo({
    url: "../mind/showGame?uri=" + item.uri,
  });
  // #endif

  // #ifdef H5
  uni.navigateTo({
    url: "../mind/showGameIframe?uri=" + item.uri,
  });
  // #endif
},
// showGameIframe.vue
<view>
  <iframe
    id="iframe"
    class="viewiframe"
    src="http://192.168.1.56:8081/webview.html"
    ref="iframe"
    @onload="onLoad"
  >
  </iframe>
</view>
mounted() {
    // 接受子页面发来的信息
    window.addEventListener("message", this.ReceiveMessage);
    //console.log("------>",this.url)
  },
methods: {
  onLoad(option) {
    console.log("---------------->onLoad", option);
  },
  ReceiveMessage(event) {
    // console.log("ReceiveMessage$$$", event);

    if (event.data && event.data.data && event.data.data.arg) {
      console.log("iframe 参数 event.data:", event.data.data.arg);
    }
  },

  SendMessage() {
    let str = toolTimer.formatTime(new Date(), "yyyy-MM-dd");
    let data = {
      action: 66,
      time: str,
    };
    document.getElementById("iframe").contentWindow.postMessage(data, "*");
  },
},

也是能收到参数的:

e17ed885885d2c18a83b2d2e782377df.png

小程序和其他端没有试过,有小程序和其他端开发需求的小伙伴可以自己再试试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uni-app中使用webview存在兼容性问题。根据引用的描述,webviewuni-app中的通信机制存在问题,可能无法正常接收数据。另外,web-view的bug也较为常见且没有被官方及时解决,因此一些开发者选择不使用web-view。而引用中提到的web-view是通过plus.webview.create创建的frame窗口,这种方式可以在uni-app中使用。但是,引用中指出,nvue获取webview窗口的方式与普通vue的方式不同,需要进行特殊处理。 解决兼容性问题可以考虑以下几点方法: 1.避免使用web-view,在uni-app中使用其他组件或技术来实现相同的功能,如使用h5标签、页面跳转等。 2.如果必须使用web-view,可以尝试使用plus.webview.create创建frame窗口的方式来解决部分兼容性问题。注意在nvue中获取webview窗口的方式需要与普通vue有所不同,可以参考引用中提到的方法进行处理。 3.及时向官方反馈发现的bug,希望能够得到官方的解决方案或修复。 综上所述,解决uni-app webview的兼容性问题可以考虑避免使用web-view、使用plus.webview.create创建frame窗口、特殊处理nvue中获取webview窗口的方式以及向官方反馈问题。具体的解决方法需要根据具体情况进行调整和选择。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [uni-app webview(非web-view)与网页的通讯方法](https://blog.csdn.net/qq_23064433/article/details/120289001)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [uniapp系列-超详细教你在uni-app+vue3里通过web-view组件传递信息打开H5页面写入localstorage并解决兼容性](https://blog.csdn.net/tangdou369098655/article/details/130234169)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值