h5与原生app交互的方法

栏目: Javascript 发布时间:2022-02-09

很多 app 都会采用混合开发的模式,也就是原生 app 与 webview 相结合的方式。混合开发的 app 被成为 Hybrid App(混合app)。

混合开发的优点:

1、开发成本低、效率高、代码复用性强 app 内嵌的 h5 页面可以在微信、浏览器、各种小程序 webview 中复用,一套代码,多端运行。

2、降低用户升级 app 成本 h5 随时发版,随时完成升级迭代,无需用户手动升级 app

混合开发的缺点:

用户体验比原生稍差

项目中要不要使用过混合开发?

app 内嵌 h5 有利有弊,我们要做的就是扬长避短,充分发挥其长处,规避其短处。 对于项目中更新迭代频率较高、用户体验不会受到很大影响的页面交易使用 webview,减少原生 app 更新迭代次数。

webview 与原生 app 通信的方法

对 webview 与原生 app 的通信方法封装一下:

const userAgent = navigator.userAgent.toLowerCase()
export const isAndroid = /android|adr/.test(userAgent)
export const isIos = !!userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)

/**
 * 调用 app 函数
 * @param {string} methodName
 * app 定义的函数的参数可以跟在 methodName 后面传过去
 * 示例:callAppFn('jsGoAppBack')、callAppFn('jsGoAppContractStatus', {
 *    status: 1,
 *    isReset: false
 *  })
 */
export const callAppFn = (methodName, params = {}) => {
  const paramsStr = JSON.stringify({
    params
  })
  // android app
  if (isAndroid) {
    window[methodName] && window[methodName].postMessage(paramsStr)
  } else {
    /**
     * ios app or h5 兼容新老版本 ios webview
     */
    if (typeof window[methodName] === 'function') {
      window[methodName](paramsStr)
    } else {
        window.webkit &&
        window.webkit.messageHandlers &&
        window.webkit.messageHandlers[methodName].postMessage(paramsStr)
    }
  }
}

webview h5 页面调用原生 app 暴露的方法进行通信,以 fnFromApp 为例

callAppFn('fnFromApp', {
  hello: 'world'
})

小结

混合开发有利有弊,我们要充分发挥其长处。项目中更新迭代频次较高的页面可以酌情考虑使用 webview 开发,较低开发和维护成本。

本文地址:https://www.tides.cn/p_js-h5-communicate-with-native-app

标签: webview html5