auto.pro 的 html 模板,带有极简的通讯示例
首次安装
npm i
生成 build 文件夹并监听 src 的变化
npm start
F1 + 运行项目,即可在模拟器或手机上运行本项目
- 如果想将 html 打包在 app 内,可以在
src/html文件夹内写代码(当然也可以另起一个 web 项目,编译后放到此项目) - 调试本地 html
执行npm run html,并在浏览器中打开localhost:9000可以实时调试本地html - 编译 html
执行npm run build,会同时编译 auto 的代码和 html 代码,在dist目录下生成编译文件
webview 可以自定义浏览器事件,因此我们可以拦截一些不常用事件,通过魔改这些事件来传值和执行安卓代码,这就是所谓的 JsBridge。在本项目里使用的是prompt事件来传递。
举栗说明:
// html部分--------------------
document.getElementById("btn").onclick = function () {
// result的值由done()的参数传过来
var result = prompt("submit", JSON.stringify("molysama"))
// alert(result)
}
// auto部分---------------------
import { effect$ } from "@auto.pro/core"
import { run } from "@auto.pro/webview"
const webview = run("file://" + files.path("dist/index.html"))
effect$.subscribe(() => {
// 监听放在effect里,只有当权限到位后,监听才生效
webview.on("submit").subscribe(([param, done]) => {
// done可以主动返回一个值给html,作为prompt('submit')的结果
// 这里啥都没传,所以结果是undefined
done()
// param是传过来的参数,也就是html部分的'molysama'
toastLog("接受到参数:" + param)
})
})auto 执行 html 的代码原理就很简单了,直接通过 webview 来执行一段代码
import { effect$ } from "@auto.pro/core"
import { run } from "@auto.pro/webview"
const webview = run("file://" + files.path("dist/index.html"))
effect$.subscribe(() => {
// 在html里执行document.title,获取到标题并返回
webview.runHtmlJS("document.title").subscribe((value) => {
toastLog(`title是${value}`)
})
// 在html里执行run,并传递两个参数
webview.runHtmlFunction("run", "hello", "world").subscribe((value) => {})
})由于本项目添加了代码混淆处理,html 内的变量名可能会被混淆,导致通讯时找不到对应的函数,请确保执行时能找到正确的函数名(如把变量挂载到 html 的window对象上)
MIT