h5与app交互
function jsCallNative(method, params, callback) {
if (typeof params === 'function') {
// 表示只传了method和callback
callback = params
params = {}
}
if (typeof params === 'undefined') {
params = {}
}
const u = window.navigator.userAgent
const isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1 // 安卓终端
const isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) // ios终端
if (callback) {
if (typeof window._callBackCount === 'undefined') {
// 初始化_callBackCount 记录回调函数count
window._callBackCount = 1
}
const callBackName = `_appCallBack${window._callBackCount}` // 回调的全局函数的名字
window[callBackName] = callback
window._callBackCount += 1
params._callFuncName = callBackName
}
try {
if (isAndroid) {
// app需要判断_callFuncName是否存在 不存在不需要执行回调
// eslint-disable-next-line no-undef
Android[method](JSON.stringify(params))
} else if (isIOS) {
window.webkit.messageHandlers[method].postMessage(JSON.stringify(params))
} else {
throw new Error('判断安卓和IOS出错')
}
return null
} catch (e) {
return e
}
}
其中method为app内部定义方法名,jsCallNative(‘appMethod’)调用类似于在h5中调用app内部定义的方法。其中window[callBackName]为回调函数,即,app内部调用h5内方法,vue项目中的回调需要绑定在window中,app才能获取到