uniapp开发的H5应用被加载到webview时,window.uni对象里没有postMessage问题

按照:https://uniapp.dcloud.net.cn/component/web-view.html

App 端使用 uni.web-view.js 的最低版为 uni.webview.1.5.4.js

因本身是uniapp应用,window.uni里已经存在原来框架uni,导致无法覆盖或添加js里的方法。

比较简单的方法是修改uni.webview.1.5.4.js源代码,直接给window.uni2(名称自定)对象赋值,使用时windwo.uni2.postMessage即可,与原有的window.uni不冲突。

!function(e, n) {
  "object" == typeof exports && "undefined" != typeof module
    ? module.exports = n()
    : "function" == typeof define && define.amd
      ? define(n)
      : (e = e || self).uni2 = n(); // 👈 关键:改为 uni2
}(this, function() {
  "use strict";

  try {
    var e = {};
    Object.defineProperty(e, "passive", { get: function() { return !0; } });
    window.addEventListener("test-passive", null, e);
  } catch (e) {}

  var n = Object.prototype.hasOwnProperty;
  function i(e, i) { return n.call(e, i); }

  var t = [];
  function r() {
    return window.__dcloud_weex_postMessage || window.__dcloud_weex_;
  }

  var o = function(e, n) {
    var i = { options: { timestamp: +new Date }, name: e, arg: n };
    if (r()) {
      if ("postMessage" === e) {
        var o = { data: [n] };
        return window.__dcloud_weex_postMessage
          ? window.__dcloud_weex_postMessage(o)
          : window.__dcloud_weex_.postMessage(JSON.stringify(o));
      }
      var a = { type: "WEB_INVOKE_APPSERVICE", args: { data: i, webviewIds: t } };
      window.__dcloud_weex_postMessage
        ? window.__dcloud_weex_postMessageToService(a)
        : window.__dcloud_weex_.postMessageToService(JSON.stringify(a));
    }
    if (!window.plus)
      return window.parent.postMessage({ type: "WEB_INVOKE_APPSERVICE", data: i, pageId: "" }, "*");
    
    if (0 === t.length) {
      var d = plus.webview.currentWebview();
      if (!d) throw new Error("plus.webview.currentWebview() is undefined");
      var s = d.parent(), w = "";
      w = s ? s.id : d.id;
      t.push(w);
    }
    if (plus.webview.getWebviewById("__uniapp__service"))
      plus.webview.postMessageToUniNView(
        { type: "WEB_INVOKE_APPSERVICE", args: { data: i, webviewIds: t } },
        "__uniapp__service"
      );
    else {
      var u = JSON.stringify(i);
      plus.webview.getLaunchWebview().evalJS(
        'UniPlusBridge.subscribeHandler("' +
          "WEB_INVOKE_APPSERVICE" +
          '",' +
          u +
          "," +
          JSON.stringify(t) +
          ");"
      );
    }
  };

  var a = {
    navigateTo: function() {
      var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
        n = e.url;
      o("navigateTo", { url: encodeURI(n) });
    },
    navigateBack: function() {
      var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
        n = e.delta;
      o("navigateBack", { delta: parseInt(n) || 1 });
    },
    switchTab: function() {
      var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
        n = e.url;
      o("switchTab", { url: encodeURI(n) });
    },
    reLaunch: function() {
      var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
        n = e.url;
      o("reLaunch", { url: encodeURI(n) });
    },
    redirectTo: function() {
      var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
        n = e.url;
      o("redirectTo", { url: encodeURI(n) });
    },
    getEnv: function(e) {
      r() ? e({ nvue: !0 }) : window.plus ? e({ plus: !0 }) : e({ h5: !0 });
    },
    postMessage: function() {
      var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
      o("postMessage", e.data || {});
    }
  };

  var d = /uni-app/i.test(navigator.userAgent),
    s = /Html5Plus/i.test(navigator.userAgent),
    w = /complete|loaded|interactive/;
  var u =
    window.my &&
    navigator.userAgent.indexOf(["t", "n", "e", "i", "l", "C", "y", "a", "p", "i", "l", "A"].reverse().join("")) > -1;
  var g = window.swan && window.swan.webView && /swan/i.test(navigator.userAgent);
  var v =
    window.qq &&
    window.qq.miniProgram &&
    /QQ/i.test(navigator.userAgent) &&
    /miniProgram/i.test(navigator.userAgent);
  var c = window.tt && window.tt.miniProgram && /toutiaomicroapp/i.test(navigator.userAgent);
  var m =
    window.wx &&
    window.wx.miniProgram &&
    /micromessenger/i.test(navigator.userAgent) &&
    /miniProgram/i.test(navigator.userAgent);
  var p = window.qa && /quickapp/i.test(navigator.userAgent);
  var f =
    window.ks &&
    window.ks.miniProgram &&
    /micromessenger/i.test(navigator.userAgent) &&
    /miniProgram/i.test(navigator.userAgent);
  var l = window.tt && window.tt.miniProgram && /Lark|Feishu/i.test(navigator.userAgent);
  var _ =
    window.jd &&
    window.jd.miniProgram &&
    /micromessenger/i.test(navigator.userAgent) &&
    /miniProgram/i.test(navigator.userAgent);
  var E = window.xhs && window.xhs.miniProgram && /xhsminiapp/i.test(navigator.userAgent);

  for (
    var h,
      P = function() {
        window.UniAppJSBridge = !0;
        document.dispatchEvent(
          new CustomEvent("UniAppJSBridgeReady", { bubbles: !0, cancelable: !0 })
        );
      },
      b = [
        function(e) {
          if (d || s)
            return window.__dcloud_weex_postMessage || window.__dcloud_weex_
              ? document.addEventListener("DOMContentLoaded", e)
              : window.plus && w.test(document.readyState)
                ? setTimeout(e, 0)
                : document.addEventListener("plusready", e), a;
        },
        function(e) {
          if (m)
            return window.WeixinJSBridge && window.WeixinJSBridge.invoke
              ? setTimeout(e, 0)
              : document.addEventListener("WeixinJSBridgeReady", e), window.wx.miniProgram;
        },
        function(e) {
          if (v)
            return window.QQJSBridge && window.QQJSBridge.invoke
              ? setTimeout(e, 0)
              : document.addEventListener("QQJSBridgeReady", e), window.qq.miniProgram;
        },
        function(e) {
          if (u) {
            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 (g) return document.addEventListener("DOMContentLoaded", e), window.swan.webView;
        },
        function(e) {
          if (c) 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) {
          if (f)
            return window.WeixinJSBridge && window.WeixinJSBridge.invoke
              ? setTimeout(e, 0)
              : document.addEventListener("WeixinJSBridgeReady", e), window.ks.miniProgram;
        },
        function(e) {
          if (l) return document.addEventListener("DOMContentLoaded", e), window.tt.miniProgram;
        },
        function(e) {
          if (_)
            return window.JDJSBridgeReady && window.JDJSBridgeReady.invoke
              ? setTimeout(e, 0)
              : document.addEventListener("JDJSBridgeReady", e), window.jd.miniProgram;
        },
        function(e) {
          if (E) return window.xhs.miniProgram;
        },
        function(e) {
          return document.addEventListener("DOMContentLoaded", e), a;
        }
      ],
      y = 0;
    y < b.length && !(h = b[y](P));
    y++
  );

  h || (h = {});

  // 👇 关键修改:不再读取或合并 window.uni,而是创建全新对象
  var B = {}; // 不再引用原有 uni
  for (var S in h) i(h, S) && (B[S] = h[S]);
  B.webView = h;

  return B; // 返回纯桥接对象
});

Comments

No comments yet. Why don’t you start the discussion?

发表回复