最近项目要求APP中要嵌套H5的页面。javascript
首先,建立两个JS文件,便于区分管理java
一、DeviceType.js用于判断环境是Android仍是IOSandroid
export const DeviceType=(()=>{ var u = navigator.userAgent; if (u.match(/Android/i) != null) { return "Android"; } else if (u.match(/iPhone|iPod|ios/i) != null) { return "IOS"; } })()
二、utilityApi.js 再建立一个文件用于封装与android和ios交互的方法,保证统一而且易于管理。要引入DeviceType.jsios
import {DeviceType} from './DeviceType'
bannerClick(id)为H5中使用的方法去调用app的方法,jumpBanner(id)为原生app的方法,两边统一,id为须要传递的参数,这里有一种状况,url传递参数为文字的时候会出现乱码的状况,这里须要进行转码处理、encodeURI()web
这里有个大坑,ios的 window.webkit.messageHandlers.方法名.postMessage();这个方法中 必需要传参数,不传参数ios那边监听不到方法名,因此若是没有参数的时候 ,写个null就行了json
window.webkit.messageHandlers.jumpBanner.postMessage(null);app
import {DeviceType} from './DeviceType' // 点击banner触发方法 export function bannerClick(id) { try { switch (DeviceType) { case "Android": window.hello.jumpBanner(id) break; case "IOS": window.webkit.messageHandlers.jumpBanner.postMessage(id); break; } } catch (e) { console.log(e) } } // 贷款机构跳转,(这里infoJson参数ios要json格式) export function loanBankRoute(infoJson) { let json = infoJson json.name = encodeURI(infoJson.name) // alert(json.name) try { switch (DeviceType) { case "Android": window.hello.jumpLoanBankHome(infoJson.id,infoJson.name) break; case "IOS": window.webkit.messageHandlers.jumpLoanBankHome.postMessage(json); break; } } catch (e) { console.log(e) } }
三、在页面中的方法触发,如今main.js中声明全局指令,我这边叫 $ocpost
import * as utilityApi from './common/utilityApi' //原生交互js Vue.prototype.$oc=utilityApi;
页面方法:this
//跳转银行详情页 selectBankDetails(id) { this.$oc.bankCardClick(id) },
这样就能够完成与原生的交互了,交互前要与身边的 android和ios 商量好变量名和方法名。url