在鸿蒙Next(HarmonyOS NEXT)中,使用uni-app开发的应用可以通过Web组件(相当于WebView)与内嵌网页进行交互。主要通过以下方式实现:
1. 应用向网页发送数据
使用runJavaScript()方法执行JS代码来传递数据给网页。
示例代码(ArkTS):
import webview from '@ohos.web.webview';
// 获取Web组件实例
let webView: webview.WebviewController = ...;
// 向网页传递数据
webView.runJavaScript(
`window.receiveDataFromApp(${JSON.stringify(data)})`,
(error) => {
if (error) {
console.error('执行JS失败');
}
}
);
网页中需预先定义接收函数:
window.receiveDataFromApp = function(data) {
console.log('收到应用数据:', data);
};
2. 网页向应用发送数据
通过Web组件的onConsole事件捕获网页console.log()输出,或使用onMessage事件接收postMessage()消息。
方法一:使用onConsole(简单调试)
应用侧代码:
webView.on('onConsole', (event) => {
if (event.message?.startsWith('APP_INTERACT:')) {
const data = event.message.replace('APP_INTERACT:', '');
console.log('收到网页数据:', data);
}
});
网页侧代码:
console.log('APP_INTERACT:' + JSON.stringify({key: 'value'}));
方法二:使用onMessage(推荐)
应用侧代码:
webView.on('onMessage', (event) => {
console.log('收到网页消息:', event.message);
});
网页侧代码:
window.hap?.postMessage(JSON.stringify({type: 'data', content: 'Hello'}));
3. 网页调用应用方法
通过runJavaScript()在网页中注入函数,调用应用定义的方法。
应用侧代码:
// 注册全局函数供网页调用
globalThis.appFunction = (param) => {
console.log('网页调用应用函数,参数:', param);
};
// 注入函数到网页
webView.runJavaScript(`
window.invokeAppFunction = function(param) {
globalThis.appFunction(param);
};
`);
网页侧代码:
window.invokeAppFunction('来自网页的参数');
4. 完整交互流程示例
// 应用侧
import webview from '@ohos.web.webview';
// 初始化Web组件
let webView: webview.WebviewController = ...;
// 监听网页消息
webView.on('onMessage', (event) => {
const data = JSON.parse(event.message);
if (data.type === 'getUserInfo') {
webView.runJavaScript(`window.updateUserInfo(${JSON.stringify({name: '用户'}))`);
}
});
// 网页侧
// 发送消息给应用
window.hap?.postMessage(JSON.stringify({type: 'getUserInfo'}));
// 接收应用数据
window.updateUserInfo = function(userInfo) {
console.log('用户信息:', userInfo);
};
注意事项:
- 权限配置:在
module.json5中配置ohos.permission.INTERNET权限。
- 安全限制:确保交互数据经过验证,防止恶意代码注入。
- 生命周期:在页面销毁时移除事件监听。
通过以上方法,uni-app应用可与WebView实现双向数据通信和功能调用。