evaluatify
在 JavaScript 与 WebView 双向调用的场景中,双方通过 native bridge 交换的数据都局限于可序列化的数据,JS 环境中许多无法序列化的数据无法通过 native bridge 导致 JavaScript 和 WebView 双向调用场景受限。
evaluatify 可以将 JavaScript 环境中的任意对象存在一个临时的全局变量中,并生成一个可执行脚本供 native 调用。
evaluatifyCallback
JS 根据传入的 callback 生成可执行脚本。
import { evaluatifyCallback } from 'evaluatify';
const script = evaluatifyCallback(function callback() {
});
window._NATIVE_INTERFACE_.getInitialState(script)
native 在收到 callback script 后可在对应的回调时机中使用 evaluateJavascript 调用。
webView.evaluateJavascript(script);
evaluatifyCallback 带参数
如果 native 需要在调用 JS callback 时需要传参需要怎么做呢?
JS 根据传入的 callback 生成可执行脚本,并指定该 callback 的参数列表。
import { evaluatifyCallback, EvaluableArgType } from 'evaluatify';
const script = evaluatifyCallback(function callback(id: string, data: { type: string; name: string; }) {
}, [EvaluableArgType.String, EvaluableArgType.Object]);
window._NATIVE_INTERFACE_.getInitialState(script)
native 在收到 callback script 后先使用 string format 填充对应的参数,然后使用 evaluateJavascript 调用,实现回调传参数。
String evaluateJavascript = String.format(script, "xxx-yyy-123", JSON.toString(object));
webView.evaluateJavascript(evaluateJavascript);
EvaluableArgType
可供 evaluatifyCallback 使用的参数类型
EvaluableArgType.String
字符串
evaluatifyCallback(function (value: string) {
}, [EvaluableArgType.String])
format placeholder: %s
EvaluableArgType.Number
数字
evaluatifyCallback(function (value: number) {
}, [EvaluableArgType.Number])
format placeholder: %f
EvaluableArgType.Boolean
布尔
evaluatifyCallback(function (value: boolean) {
}, [EvaluableArgType.Boolean])
format placeholder: %b
EvaluableArgType.Evaluable
evaluatifyCallback 或者 evaluatifyValue 生成的可执行字符串,用于 evaluatifyCallback 参数嵌套。
evaluatifyCallback(function (value: string) {
}, [EvaluableArgType.Evaluable])
format placeholder: %s
EvaluableArgType.Object
可序列化的对象
evaluatifyCallback(function (value: object) {
}, [EvaluableArgType.Object])
format placeholder: %s
evaluatifyValue
将任意的 JS 值转成可执行脚本,主要作为 evaluatifyCallback 的 EvaluableArgType.Evaluable 类型传参。
dealloc
由于 evaluatify 底层原理是将需要转为可执行脚本的值临时挂在全局变量上,所以在使用完成后需要手动从全局变量上释放对应值的引用,防止内存泄露。
Q&A
使用限制
主流 webview 平台甚至 nodejs 的 native bridge 都可以使用 evaluatify 进行复杂场景的数据交换。
但 evaluatifyCallback 参数列表需要固定,类型和参数数量不能随意变动。