实现:H5与原生APP(Android或Ios)相互交互

  • Android端:让原生APP开发人员在window对象上绑定方法属性,同步执行,前端直接调用对应方法即可。
/* H5调用Android方法(因IOS限制,需统一都传参,没有就传空字符,具体APP开发定),
Android返回H5需要的json对象数据,同步执行的。
示例如下:
*/
const userInfoJsonObj = window.androidApp && window.androidApp.getUserInfo("")
  • IOS端:需通过bridge对象调用IOS定义的方法,异步执行,需注意如果IOS端没有定义方法,bridge不会返回任何数据也会不报什么错误。

问:H5嵌入APP,如何区分当前环境是APP(H5调用IOS方法),还是其他环境(H5不调IOS方法)?

答:让Android&IOS开发人员,修改下用户代理即(userAgent), 在原有用户代理字符串后面,新增特殊标志字符-》H5读取navigator.userAgent来判断即可。
 

第1步:在utils目录下新建bridge.js工具文件。

// bridge.js: 用于实现H5跟Ios交互的工具。
export const setupWebViewJavascriptBridge = (callback) => {
  if ((window).WebViewJavascriptBridge) {
    return callback((window).WebViewJavascriptBridge)
  }
  if ((window).WVJBCallbacks) {
    return (window).WVJBCallbacks.push(callback)
  }
  (window).WVJBCallbacks = [callback]
  const WVJBIframe = document.createElement('iframe')
  WVJBIframe.style.display = 'none'
  WVJBIframe.src = 'https://__bridge_loaded__'
  document.documentElement.appendChild(WVJBIframe)
  setTimeout(() => {
    document.documentElement.removeChild(WVJBIframe)
  }, 0)
}
 
export const callIosBridge = (IosMethodName, params, callback) => {
  setupWebViewJavascriptBridge((bridge) => {
    bridge.callHandler(IosMethodName, params, callback)
  })
}

第2步:H5调用IOS方法即可。

import { callIosBridge } from '@/utils/bridge'
const u = navigator.userAgent // 用户代理
const isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1 // android终端
const isIos = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) // ios终端
 
// 从原生APP中获取登录的用户信息
export function getUserInfoObjFromNativeAPP() {
	return new Promise((resolve, reject)=> {
	   if (!isAndroid && !isIos) { reject() }
	   if (isAndroid) {
        // 调用Android端的getUserInfo方法。
		const data = window.androidApp && window.androidApp.getUserInfo("")
		data ? resolve(JSON.parse(data) ) : resolve(null)
	   } else {
           // 调用IOS的getUserInfo方法,传参为空字符,回调函数中H5拿到想要的json对象数据
		   callIosBridge('getUserInfo', '', (data) => {
			data ? resolve(JSON.parse(data) ) : resolve(null)
		  })
	  }
  })
}

Vue调用Android的方法

1、在vue页面中自己写个按钮,通过点击按钮来调用Android封装好的方法。

<template>
  <div>
      <button @click="scan()">点击</button>
  </div>
</template>

2、点击时咱们给安卓传个参数,安卓定义好参数类型。

export default {
  name: 'home',
  data () {
    return {
        arr:'123' //给安卓传参数,安卓需要定义参数类型
    }
  },
  methods:{
    scan: function(arr) {
        window.android.takePhoto(this.arr);
        //takePhoto()是安卓定义好的方法
    }      
  }
}

原文:实现:H5与原生APP(Android或Ios)相互交互。_window.android调原生app_qq_38969618的博客-CSDN博客

Vue调用Android的方法 | 码农家园

<!--认证成功  rxcgappZ-->
<template>
  <div>
    <div class="bjhui">
      <p class="zfcg_zfztbt">认证成功</p>
      <!--认证成功-->
      <div class="zfcg_bj">
        <div class="zfcg_my_zfzt">
          <div class="zfcg_zt">
            <p class="zfcg_zfcgico">
              <img src="@/assets/images/zhuangzhu/zfcgico.png">
            </p>
            <p class="zfcg_zfbt">认证成功!</p>
          </div>
        </div>
        <div class="bottom_fh">
          <button @click="scan()" class="bm50_btn">返回APP</button>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'rxcgappZ',
  data () {
    return {
      arr:'123' //给安卓传参数,安卓需要定义参数类型
    }
  },
  methods:{
    scan: function(arr) {
      var cc=this.isAndroid()
      if(cc){
        //alert(111)
        window.android.androidFinish(); //androidFinish()是安卓定义好的方法
      }else{
       // alert(222)
      }
    },
    isAndroid(){
      let userName = window.navigator.userAgent;
      if (userName.indexOf('Andorid') > -1 || userName.indexOf('Linux') > -1) {
        return true
      }
      return false
    }
  }
}
</script>
<style scoped>
</style>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值