H5 与 App、网页之间的通信

前言

本文整理工作中 H5 嵌入 Android、iOS 与 PC 网页后,如何与各端通信。(提供 H5 端的代码)

环境判断

  const ua = navigator.userAgent.toLowerCase()
  const isAndroid = /android/i.test(ua)
  const isIos = /iphone|ipod|ios/i.test(ua)
  const isIpad = /ipad/i.test(ua)
  const isMobile = isAndroid || isIos || isIpad
  const isWx = /micromessenger/i.test(ua) // 微信
  const isWxWork = /wxwork/.test(ua) // 企业微信
  const isQq = /QQ\/([\d\.]+)/i.test(ua) // QQ
  const isQz = ua.indexOf('qzone/') > -1 // QQ空间
  const isByteDance = /bytedancewebview/i.test(ua) // 字节跳动
  const isTickTok = /ttwebview/i.test(ua) // 抖音

Android

if (isAndroid) {
  // 通知 app 打开弹窗, 并传参。方法在 app 中定义
  window.androidFunc.openDialog(JSON.stringify({ id: 1 })) 
}
// 监听app主动触发刷新事件
window.appReload = (params) => {}

iOS/iPad

if (isIos) {
  // 通知 app 打开弹窗, 并传参。方法在 app 中定义 
  window.webkit.messageHandlers.openDialog.postMessage({ id: 1 })
}
// 监听app主动触发刷新事件
window.appReload = (params) => {}

PC

这里讨论网页通过 iframe 方式嵌入 H5 的方式

// 网页嵌套 H5
<iframe ref="detIframe" :src="url" frameborder="0" style="width: 100%; height: 100%"></iframe>

// H5发送消息
// 这里可以指定具体可接收消息的窗口
window.parent.postMessage({ open: true }, url)
// 也可不指定
window.parent.postMessage({ open: true }, '*')

// PC接收消息
window.addEventListener("message", receiveMessage, false)
function receiveMessage(event) {  
  // 检查消息的来源是否是我们期望的  
  if (event.origin !== "http://example.com") return
  // 处理接收到的数据  
  console.log("Received message:", event.data);  
}

// PC 发送消息
this.$refs.detIframe.contentWindow.postMessage(
  {
	data: data,
  },
  url
)

H5 与 App 之间的通信方式

以下内容来自文言一心

1. URL Scheme

URL Scheme是一种在移动应用中定义自定义URL协议的方式,通过它可以实现App与H5之间的跳转和通信。H5页面可以通过链接到特定的URL Scheme来触发App执行某些操作,反之亦然。

举个例子:

<!-- 打开微信 -->
<a href="weixin://">打开微信</a>

<!-- 打开支付宝 -->
<a href="alipays://">打开支付宝</a>

<!-- 打开支付宝的扫一扫 -->
<a href="alipays://platformapi/startapp?saId=10000007">打开支付宝的扫一扫</a>

<!-- 打开支付宝的蚂蚁森林 -->
<a href="alipays://platformapi/startapp?appId=60000002">打开支付宝的蚂蚁森林</a>

2. Deep Linking

Deep Linking是一种允许用户直接打开App中特定页面或功能的链接技术。它通常与URL Scheme结合使用,使得H5页面可以直接跳转到App的某个深层页面。

3. Universal Links(iOS)和App Links(Android)

Universal Links是苹果推出的一种技术,允许用户在Safari浏览器中直接打开App的特定页面,而无需先跳转到App的首页。类似地,Android平台有App Links,也实现了类似的功能。

4. WebView与JavaScript桥接

如果App内嵌了一个WebView来展示H5页面,那么可以通过WebView的JavaScript接口与原生代码进行通信。通常,这涉及到在原生代码中注入JavaScript代码,或者通过WebView的特定方法来调用原生方法。

5. 第三方库和框架

有一些第三方库和框架提供了更便捷的方式来实现App与H5之间的通信,比如React Native的WebView组件就提供了与H5页面通信的功能。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当在H5页面中使用JSBridge与APP通信时,需要先在APP端注入一个JSBridge对象,然后在H5页面中通过该对象调用APP提供的方法。下面是具体的实现步骤: 1. 在APP端注册一个JSBridge对象,并注入到WebView中。这里以Android为例,示例代码如下: ```java WebView webView = findViewById(R.id.web_view); WebViewJavascriptBridge bridge = new WebViewJavascriptBridge(webView, new BridgeHandler() { @Override public void handler(String data, CallBackFunction function) { // 处理H5页面发送过来的数据 } }); bridge.registerHandler("test", new BridgeHandler() { @Override public void handler(String data, CallBackFunction function) { // 处理H5页面发送过来的test数据 } }); ``` 其中,WebViewJavascriptBridge是一个封装了WebView和JSBridge的类,BridgeHandler是一个处理JSBridge消息的接口,CallBackFunction是一个回调函数,用于将结果返回给H5页面。在这个示例中,我们注册了一个名为"test"的方法,并在其中处理从H5页面发送过来的数据。 2. 在H5页面中引入WebViewJavascriptBridge.js文件,并在页面加载完毕后初始化JSBridge对象。示例代码如下: ```javascript <script src="WebViewJavascriptBridge.js"></script> <script> // 初始化JSBridge对象 var bridge = new WebViewJavascriptBridge(function(message, responseCallback) { // 处理APP端发送过来的数据 }); // 发送数据给APP端 bridge.send('Hello from H5!'); // 调用APP端提供的方法 bridge.callHandler('test', {'data': 'Hello from H5!'}, function(response) { // 处理APP端返回的结果 }); </script> ``` 在这个示例中,我们初始化了一个JSBridge对象,并发送了一条消息给APP端。同时,我们还调用了APP端提供的名为"test"的方法,并将包含"data"字段的JSON对象作为参数传递给了APP端。当APP端处理完这个方法后,会将结果返回给H5页面,并通过回调函数处理这个结果。 通过上述步骤,就可以在H5页面中使用JSBridge与APP端进行通信了。需要注意的是,JSBridge的实现方式可能因平台和版本而异,具体实现方式需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值