前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >H5与Android&iOS客户端原生APP通信交互实现

H5与Android&iOS客户端原生APP通信交互实现

作者头像
德顺
发布2021-01-21 17:38:05
2.5K0
发布2021-01-21 17:38:05
举报
文章被收录于专栏:前端资源前端资源

最近有个需求,原生 APP 使用 webView 内嵌 H5 页面,APP 未登录状态下打开 H5 页面,在页面中登录,再返回 APP 时要保持登录状态(APP 也要同步登录)。

首先写一个方法,来获取设备信息:./getDevice.js

代码语言:javascript
复制
/*
 * 获取设备信息
 * */
export function getDevice() {
  let ua = navigator.userAgent
  return {
    trident: ua.indexOf('Trident') > -1, //IE内核
    presto: ua.indexOf('Presto') > -1, //opera内核
    webKit: ua.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
    gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') == -1,//火狐内核
    mobile: !!ua.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
    iOS: !!ua.match(/\(i[^;]+;( U;)? CPua.+Mac OS X/), //ios终端
    Android: ua.indexOf('Android') > -1 || ua.indexOf('Adr') > -1, //android终端
    iPhone: ua.indexOf('iPhone') > -1 , //是否为iPhone或者QQHD浏览器
    iPad: ua.indexOf('iPad') > -1, //是否iPad
    webApp: ua.indexOf('Safari') == -1, //是否web应该程序,没有头部与底部
    weixin: ua.indexOf('MicroMessenger') > -1, //是否微信 (2015-01-22新增)
    qq: ua.match(/\sQQ/i) == " qq" //是否QQ
  }
}

然后封装一个处理与 APP 通信的方法:./appBridge.js

代码语言:javascript
复制
import {getDevice} from './getDevice'

export function appBridge(token, url, device) {
  var app = device
  var data = {}
  if (!app) {
    app = getDevice()
  }
  if (app == "iOS" || app == "iPhone" || app == "iPad") {
    console.log('设备信息:iOS')
    /*
    * Apple 系列设备
    * name: getMessenger 发送的方法
    * data: { 发送的内容
    *   oppcToken: oppcToken
    * }
    * */
    data = {
      oppcToken: token
    }
    window.webkit.messageHandlers.getMessenger.postMessage(data);
  } else if (getDevice() == "Android") {
    /*
    * Android 设备
    * data: { 发送的内容
    *   oppcToken: oppcToken
    * }
    * responseData: 请求返回数据
    * */
    data = {
      oppcToken: token
    }
    window.WebViewJavascriptBridge.send(data, function (responseData) {
      console.log('请求结果:' + responseData)
    })
  } else if (app == "H5") {
    /*
    * 浏览器&H5
    * */
    console.log('设备信息:H5')
    if (url) {
      window.location.href = url
    }
  }
}

在需要的页面调用:./index.vue

代码语言:javascript
复制
import { appBridge } from './appBridge'

appBridge(token, url, device)

这里我查了一下上面的两个方法:

MessageHandler

WKWebView 有一个内容交互控制器,该对象提供了通过 JSWKWebView 发送消息的途径。需要设置 MessageHandler ,我把这个功能简称为 MessageHandler

通常用于 H5 javaScript 与 iOS 进行交互

语法:

代码语言:javascript
复制
/*
* name: 设置 MessageHandler 的第二个参数,iOS 那边来接收
* messageBody: 发送的内容
*/
window.webkit.messageHandlers.<name>.postMessage(<messageBody>)

示例:

代码语言:javascript
复制
window.webkit.messageHandlers.getMessenger.postMessage(data)

WebViewJavascriptBridge

针对 Android 设备,这里使用的 WebViewJavaScriptBridge 方法,用于 WKWebView & UIWebViewOCJS 交互。

示例:

代码语言:javascript
复制
/*
* data: 发送的数据
* responseData: 请求返回的结果
*/
window.WebViewJavascriptBridge.send(data, function (responseData) {
  console.log('请求结果:' + responseData)
})
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MessageHandler
  • WebViewJavascriptBridge
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档