首页 > 其他分享 >uni-app实现web-view和App之间的互相通信

uni-app实现web-view和App之间的互相通信

时间:2024-07-17 12:29:13浏览次数:17  
标签:function web postMessage app window arguments && var uni

1.web-view向App传递消息

官网对于uni-app使用web-view的介绍如下:web-view

 注意事项提到postMessage方法,这就是web-view向App传递消息的方法,使用如下:

 

注意H5本身不支持uni-app里面的方法,所以在项目中引入支持调用uni-app方法的库

 web-view页面使用:

uni.postMessage({
    data: {
        action: 'click'
    }
});

uni-app接受消息:

view>
    <!--  #ifdef APP-PLUS -->
    <uni-status-bar></uni-status-bar>
    <!--  #endif -->
    <web-view @message="getMessage" :src="webViewUrl"></web-view>
</view>

getMessage(e) {
   console.log('webView传递过来的消息')
   const action = e.detail.data[0].action
 }

这种方法只能适用于H5不是UNI写的,如果是UNI写的会报错  

uni.postMessage 不是一个方法,原因在于 webview 的uni方法和dUni-app 的uni方法冲突了,解决办法,把js下载下来里面的方法明换掉;
例如:
! function (e, n) {
  "object" == typeof exports && "undefined" != typeof module ? module.exports = n() : "function" == typeof define && define.amd ? define(n) : (e = e || self).webUni = n()
}(this, (function () {
  "use strict";
  try {
    var e = {};
    Object.defineProperty(e, "passive", {
      get: function () {
        !0
      }
    }), window.addEventListener("test-passive", null, e)
  } catch (e) {}
  var n = Object.prototype.hasOwnProperty;

  function t(e, t) {
    return n.call(e, t)
  }
  var i = [],
    a = function (e, n) {
      var t = {
        options: {
          timestamp: +new Date
        },
        name: e,
        arg: n
      };
      if (window.__dcloud_weex_postMessage || window.__dcloud_weex_) {
        if ("postMessage" === e) {
          var a = {
            data: [n]
          };
          return window.__dcloud_weex_postMessage ? window.__dcloud_weex_postMessage(a) : window.__dcloud_weex_.postMessage(JSON.stringify(a))
        }
        var o = {
          type: "WEB_INVOKE_APPSERVICE",
          args: {
            data: t,
            webviewIds: i
          }
        };
        window.__dcloud_weex_postMessage ? window.__dcloud_weex_postMessageToService(o) : window.__dcloud_weex_.postMessageToService(JSON.stringify(o))
      }
      if (!window.plus) return window.parent.postMessage({
        type: "WEB_INVOKE_APPSERVICE",
        data: t,
        pageId: ""
      }, "*");
      if (0 === i.length) {
        var r = plus.webview.currentWebview();
        if (!r) throw new Error("plus.webview.currentWebview() is undefined");
        var d = r.parent(),
          s = "";
        s = d ? d.id : r.id, i.push(s)
      }
      if (plus.webview.getWebviewById("__uniapp__service")) plus.webview.postMessageToUniNView({
        type: "WEB_INVOKE_APPSERVICE",
        args: {
          data: t,
          webviewIds: i
        }
      }, "__uniapp__service");
      else {
        var w = JSON.stringify(t);
        plus.webview.getLaunchWebview().evalJS('UniPlusBridge.subscribeHandler("'.concat("WEB_INVOKE_APPSERVICE", '",').concat(w, ",").concat(JSON.stringify(i), ");"))
      }
    },
    o = {
      navigateTo: function () {
        var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
          n = e.url;
        a("navigateTo", {
          url: encodeURI(n)
        })
      },
      navigateBack: function () {
        var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
          n = e.delta;
        a("navigateBack", {
          delta: parseInt(n) || 1
        })
      },
      switchTab: function () {
        var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
          n = e.url;
        a("switchTab", {
          url: encodeURI(n)
        })
      },
      reLaunch: function () {
        var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
          n = e.url;
        a("reLaunch", {
          url: encodeURI(n)
        })
      },
      redirectTo: function () {
        var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
          n = e.url;
        a("redirectTo", {
          url: encodeURI(n)
        })
      },
      getEnv: function (e) {
        window.plus ? e({
          plus: !0
        }) : e({
          h5: !0
        })
      },
      postMessage: function () {
        var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
        a("postMessage", e.data || {})
      }
    },
    r = /uni-app/i.test(navigator.userAgent),
    d = /Html5Plus/i.test(navigator.userAgent),
    s = /complete|loaded|interactive/;
  var w = window.my && navigator.userAgent.indexOf("AlipayClient") > -1;
  var u = window.swan && window.swan.webView && /swan/i.test(navigator.userAgent);
  var c = window.qq && window.qq.miniProgram && /QQ/i.test(navigator.userAgent) && /miniProgram/i.test(navigator.userAgent);
  var g = window.tt && window.tt.miniProgram && /toutiaomicroapp/i.test(navigator.userAgent);
  var v = window.wx && window.wx.miniProgram && /micromessenger/i.test(navigator.userAgent) && /miniProgram/i.test(navigator.userAgent);
  var p = window.qa && /quickapp/i.test(navigator.userAgent);
  for (var l, _ = function () {
      window.UniAppJSBridge = !0, document.dispatchEvent(new CustomEvent("UniAppJSBridgeReady", {
        bubbles: !0,
        cancelable: !0
      }))
    }, f = [function (e) {
      if (r || d) return window.__dcloud_weex_postMessage || window.__dcloud_weex_ ? document.addEventListener("DOMContentLoaded", e) : window.plus && s.test(document.readyState) ? setTimeout(e, 0) : document.addEventListener("plusready", e), o
    }, function (e) {
      if (v) return window.WeixinJSBridge && window.WeixinJSBridge.invoke ? setTimeout(e, 0) : document.addEventListener("WeixinJSBridgeReady", e), window.wx.miniProgram
    }, function (e) {
      if (c) return window.QQJSBridge && window.QQJSBridge.invoke ? setTimeout(e, 0) : document.addEventListener("QQJSBridgeReady", e), window.qq.miniProgram
    }, function (e) {
      if (w) {
        document.addEventListener("DOMContentLoaded", e);
        var n = window.my;
        return {
          navigateTo: n.navigateTo,
          navigateBack: n.navigateBack,
          switchTab: n.switchTab,
          reLaunch: n.reLaunch,
          redirectTo: n.redirectTo,
          postMessage: n.postMessage,
          getEnv: n.getEnv
        }
      }
    }, function (e) {
      if (u) return document.addEventListener("DOMContentLoaded", e), window.swan.webView
    }, function (e) {
      if (g) return document.addEventListener("DOMContentLoaded", e), window.tt.miniProgram
    }, function (e) {
      if (p) {
        window.QaJSBridge && window.QaJSBridge.invoke ? setTimeout(e, 0) : document.addEventListener("QaJSBridgeReady", e);
        var n = window.qa;
        return {
          navigateTo: n.navigateTo,
          navigateBack: n.navigateBack,
          switchTab: n.switchTab,
          reLaunch: n.reLaunch,
          redirectTo: n.redirectTo,
          postMessage: n.postMessage,
          getEnv: n.getEnv
        }
      }
    }, function (e) {
      return document.addEventListener("DOMContentLoaded", e), o
    }], m = 0; m < f.length && !(l = f[m](_)); m++);
  l || (l = {});
  var E = "undefined" != typeof webUni ? webUni : {};
  if (!E.navigateTo)
    for (var b in l) t(l, b) && (E[b] = l[b]);
  return E.webView = l, E
}));

这里将Uni方法换位了webUni

调用

webUni.postMessage({
                        data: {
                            randstr: res.randstr,
                            ticket: res.ticket
                        }
                    });

 

 

标签:function,web,postMessage,app,window,arguments,&&,var,uni
From: https://www.cnblogs.com/haonanZhang/p/18307054

相关文章

  • 海外短剧系统(h5+APP)搭建源码部署,海外短剧看剧平台搭建
    一、海外短剧看剧小程序//#ifdefAPP-PLUS constrequest=require('./common/request/index').default constutils=require('./common/utils/index.js').default importcheckappupdatefrom'@/common/utils/checkappupdate.js' importapifr......
  • uniapp [全端兼容] - 详细实现用户电子签名 “逐字校验“ 将姓名按字拆开分别手写签署
    前言如果您需要“合同专用”签字板及展示,请访问这篇文章。在uni-app全平台兼容(H5网页网站、支付宝/微信小程序、安卓App、苹果App、nvue)项目开发中,详解完成用户进行电子签名时,将其姓名进行拆分为独立的汉字,并由系统自动生成渲染对应的单个汉字文字的签名和验证笔画......
  • 如何在Mac上隐藏APP? 在Mac上隐藏不用的APP小技巧
    在Mac电脑中我们每天要使用很多APP,虽然Mac切换APP窗口的快捷键非常方便,但同时使用几个APP窗口是不是特别容易搞混?看起来乱糟糟的。下面我们分享在Mac上隐藏不用的APP小技巧,让用户摆脱混乱的APP窗口。1、在Mac电脑中,打开你想要保留的APP;2、点击屏幕顶部菜单栏中APP名称,3、选择下拉......
  • ant-design-blazor web page页面开发-页面结构
    page页面文件的代码详细解析:1.命名空间和布局设置:@namespaceAntDesign.Pro.Template.Pages.User:定义了当前页面的命名空间。@layoutUserLayout:指定了页面使用的布局模板。2.页面路由:@page"/user/login":定义了页面的路由地址。3.页面结构:页面容器和面包屑导航HomeForm......
  • make sadservers happy again
    背景从阮一峰老师的博客了解到sadserver这样一个可以提供linux服务器,并尝试解决系统和服务相关问题的在线测试平台。非常难得的是它可以直接提供一个公网的linux服务器(一般40-60分钟后会自动销毁),你可以在上面做任何探索。对于想要学习常用linux指令的同学,是一个非常不......
  • unity局部坐标和世界坐标角度介绍
    在Unity中,局部坐标(LocalCoordinates)和世界坐标(WorldCoordinates)是描述物体位置的两种不同方式:局部坐标(LocalCoordinates):局部坐标是相对于物体自身的坐标系来描述物体上的点的位置。对于一个物体而言,它的局部坐标原点通常位于物体的中心,坐标轴则沿着物体的局部方向。例如,......
  • 【App渗透】BurpSuite插件-Brida 2024最新自动加解密Custom plugins演示
    文章目录前言一、测试app的客户端和服务端二、BurpSuite设置代理三、反编译apk文件四、编写brida/fridahook脚本五、Customplugins自动加解密六、本期送书《二进制安全基础》如何领书总结前言之前有写过如何安装brida的文章和视频讲解,大家感兴趣的可以看看之前......
  • 基于web的人力资源管理系统 毕业设计 springboot+Vue+mysql
    介绍在当今企业管理中,人力资源的有效管理对于组织的发展至关重要。为了提高人力资源管理的效率和准确性,我们开发了这个基于Web的人力资源管理系统。该系统旨在为企业提供一个全面、便捷、高效的人力资源管理平台,满足企业对人力资源规划、招聘、培训、绩效管理等方面的需求。......
  • web安全前期的信息收集工作
    首先你需要获得目标网站的真实IP地址,可以通过IP反查域名(web查询)、域名查询IP(web查询)等查出其IP,方便进行后续操作。有个小技巧:CDN流量收费高,所以很多站长可能只会对主站或者流量大的子站点做了CDN,而很多小站子站点又跟主站在同一台服务器或者同一个C段内,此时就可以通过查询子域......
  • 微调(Fine-Tuning)和检索增强生成(RAG)
    微调(Fine-Tuning)和检索增强生成(RAG)https://www.toutiao.com/article/7386094597421810186/?log_from=21b91ee0752_17211185181952024-06-3009:05·架构笔记  微调(Fine-Tuning)过程的核心,是在新的任务和数据集上对预训练模型的参数进行微小的调整,使其能精准契合目标场景......