webapp前端和安卓java, IOS swift 之间方法的互相调用

export default {
  run(fn, data, cb) {
    console.log(fn, data, cb)
    /**
     * @fn 调用java 反射的方法
     * @data 调用方法携带的参数
     * @cb 调用失败的回调函数(可选)
     */
    var u = navigator.userAgent
    var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1 //  android终端
    var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) // ios终端

    if (isAndroid) {
      try {
        if (window.snailJsBridge && window.snailJsBridge.invoke) {
          window.snailJsBridge.invoke(fn, JSON.stringify(data))
        }
      } catch (err) {
        cb(new Error('方法调用失败'))
      }
    } else if (isiOS) {
      try {
        window.webkit.messageHandlers[fn].postMessage(data)
      } catch (err) {
        cb(new Error('方法调用失败'))
      }
    } else {
      cb(new Error('请在真机App中调用此方法'))
    }
  },

  /**
   *
   * @param {fn} fn 扫码成功, 后台调用前端的函数名
   * @param {*} cb 扫码失败的回调
   */
  appScan(fn, cb) {
    this.run(
      'scan',
      {
        function: fn
      },
      cb
    )
  },

  /**
   * @param {fn} 挂载函数
   * @param {cb} 错误回调
   */

  appGetLocation(fn, cb) {
    this.run('getLocation', { function: fn }, cb)
  },

  /**
   * @param {*} tel: 要拨打的电话号码
   * @param {*} cb : 拨号失败的回调函数
   */
  appCall(tel, cb) {
    this.run('call', { url: tel }, cb)
  }
}

 

posted @ 2021-07-07 11:18  深海里的星星i  阅读(135)  评论(0)    收藏  举报