APP中嵌入h5,如何通过window.WebViewJavascriptBridge进行交互

本文主要是涉及这样一个需求,公司的移动端项目比较多,但是不想安装过多的APP,于是所有项目以H5的形式开发,最后嵌入进APP的壳子中,继而只需要安装一个app; 那么这里边存在一个问题,h5与原生app如何进行交互呢?
原生app跳转进相应的H5界面,需要携带一些用户信息,本文主要是通过window.WebViewJavascriptBridge悄悄的进行数据交互。

本文主要站在h5的角度进行讲解:

第一步: 创建一个bridge.js文件,编写如下公共代码:

/* eslint-disable */
// 根据navigator.userAgent判断一下当前环境属于ios环境还是按住哦环境
let isAndroid =
  navigator.userAgent.indexOf("Android") > -1 ||
  navigator.userAgent.indexOf("Adr") > -1;
let isiOS = !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);

/** 针对安卓和ios系统,对window.WebViewJavascriptBridge进行兼容性处理 */
//这是必须要写的,用来创建一些设置
function setupWebViewJavascriptBridge(callback) {
  //Android使用
  if (isAndroid) {
    if (window.WebViewJavascriptBridge) {
      callback(WebViewJavascriptBridge);
    } else {
      //添加dom事件
      document.addEventListener(
        "WebViewJavascriptBridgeReady",
        function() {
          callback(WebViewJavascriptBridge);
        },
        false
      );
    }
    sessionStorage.phoneType = "android";
  }

  //iOS使用
  if (isiOS) {
    if (window.WebViewJavascriptBridge) {
      return callback(WebViewJavascriptBridge);
    }
    if (window.WVJBCallbacks) {
      return window.WVJBCallbacks.push(callback);
    }
    window.WVJBCallbacks = [callback];
    var WVJBIframe = document.createElement("iframe");
    WVJBIframe.style.display = "none";
    WVJBIframe.src = "wvjbscheme://__BRIDGE_LOADED__";
    document.documentElement.appendChild(WVJBIframe);
    setTimeout(function() {
      document.documentElement.removeChild(WVJBIframe);
    }, 0);
    sessionStorage.phoneType = "ios";
  }
}
//注册回调函数,第一次连接时调用 初始化函数(android需要初始化,ios不用)
setupWebViewJavascriptBridge(function(bridge) {
  if (isAndroid) {
    //初始化
    bridge.init(function(message, responseCallback) {
      var data = {
        "Javascript Responds": "Wee!"
      };
      responseCallback(data);
    });
  }
});

export default {
  // js调APP方法 (参数分别为:app提供的方法名  传给app的数据  回调)
  callHandler(name, data, callback) {
    setupWebViewJavascriptBridge(function(bridge) {
      bridge.callHandler(name, data, callback);
    });
  },
  // APP调js方法 (参数分别为:js提供的方法名  回调)
  registerHandler(name, callback) {
    setupWebViewJavascriptBridge(function(bridge) {
      bridge.registerHandler(name, function(data, responseCallback) {
        callback(data, responseCallback);
      });
    });
  }
};

第二步: 全局注册bridge
在main.js中

import Bridge from '@/utils/bridge'
Vue.prototype.$bridge = Bridge

第三步: 去相应h5项目中的界面中开始交互

// 设置用信息

this.$bridge.callHandler("sendUserInfo", JSON.stringify(temp), () => {})

// 获取用户信息

this.$bridge.callHandler("getUserInfo","", res =>{
          const temp = JSON.parse(res)
     }
})

// 切换系统的方法(多个h5项目在原生app的壳子中进行切换)

changeSys(){
      var temp={
        flag:'1',
        system:'MTS'
      }
      this.$bridge.callHandler("changeSys",JSON.stringify(temp),()=>{})
    },

在这里插入图片描述

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 iOS App 嵌入 H5 页面时,可以通过拦截 `window.open()` 方法来控制打开新窗口的行为。下面是一种常用的方法: 1. 首先,在你的 iOS AppWebview 的代理方法,拦截 `shouldStartLoadWithRequest` 方法。这个方法会在每次加载请求时被调用。 2. 在 `shouldStartLoadWithRequest` 方法,检查请求的 URL 是否包含 `window.open()` 方法。你可以使用正则表达式或者字符串匹配来判断。 3. 如果匹配成功,你可以自定义打开新窗口的行为。例如,你可以在原生 App 打开一个新的 Webview 来加载对应的 URL,而不是在当前的 Webview 打开。 以下是一个简单的示例代码,演示了如何拦截 `window.open()` 方法并在原生 App 打开新窗口: ```swift func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { guard let url = navigationAction.request.url else { decisionHandler(.allow) return } let urlString = url.absoluteString if urlString.contains("window.open()") { // 拦截到 window.open() 方法 // 在这里自定义打开新窗口的行为 // 取消当前请求 decisionHandler(.cancel) // 在原生 App 打开新窗口 let newWebView = WKWebView(frame: webView.frame) let newRequest = URLRequest(url: url) newWebView.load(newRequest) self.view.addSubview(newWebView) // 完成处理 decisionHandler(.allow) } else { decisionHandler(.allow) } } ``` 请根据你的具体需求进行修改和适配。希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值