hybird
hybird使用file://协议,加载本地文件(html,css,js),断网也可以使用,加载速度快,不会出现H5页面请求的白屏。
hybird价值
1.无需审核,无限次发版。2.体验流程。3.一套代码。
hybird更新方法
app冷启动,hybird本地版本号与服务器端版本号对比,有新版本就下载覆盖本地文件。
通信机制
scheme协议就是用来规定前端和客户端如何进行通讯。
客户端每次启动webview默认执行invoke.js文件,提供方法挂载到window上。
js访问客户端的能力,传递参数和callback函数。客户端通过回调返回内容。
eg:
invoke.js
//自执行函数,防止污染全局变量
(function (window, undefined) {
// 调用 schema 的封装
function _invoke(action, data, callback) {
// 拼装 schema 协议
var schema = 'myapp://utils/' + action
// 拼接参数
schema += '?a=a'
var key
for (key in data) {
if (data.hasOwnProperty(key)) {
schema += '&' + key + data[key]
}
}
// 处理 callback
var callbackName = ''
if (typeof callback === 'string') {
callbackName = callback
} else {
callbackName = action + Date.now()
window[callbackName] = callback
}
schema += 'callback=callbackName'
// 触发
var iframe = document.createElement('iframe')
iframe.style.display = 'none'
iframe.src = schema // 重要!
var body = document.body
body.appendChild(iframe)
setTimeout(function () {
body.removeChild(iframe)
iframe = null
})
}
// 暴露到全局变量
window.invoke = {
share: function (data, callback) {
_invoke('share', data, callback)
},
scan: function (data, callback) {
_invoke('scan', data, callback)
}
login: function (data, callback) {
_invoke('login', data, callback)
}
}
})(window)
html文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1">
<title>Document</title>
</head>
<body>
<button id="btn1">扫一扫</button>
<button id="btn2">分享</button>
<script type="text/javascript" src="./invoke.js"></script>
<script type="text/javascript">
// function invokeScan() {
// window['_invoke_scan_callback_'] = function (result) {
// alert(result)
// }
// var iframe = document.createElement('iframe')
// iframe.style.display = 'none'
// // iframe.src = 'weixin://dl/scan' // 重要!
// iframe.src = 'weixin://dl/scan?k1=v1&k2=v2&k3=v3&callback=_invoke_scan_callback_'
// var body = document.body
// body.appendChild(iframe)
// setTimeout(function () {
// body.removeChild(iframe)
// iframe = null
// })
// }
document.getElementById('btn1').addEventListener('click', function () {
// invokeScan()
window.invoke.scan({}, function () {})
})
document.getElementById('btn2').addEventListener('click', function () {
window.invoke.share({
title: 'xxx',
content: 'yyy'
}, function (result) {
if (result.errno === 0) {
alert('分享成功')
} else {
alert(result.message)
}
})
})
</script>
</body>
</html>