HarmonyOS鸿蒙Next中web桥接h5,不支持callback回调与h5进行异步通信,如何解决

HarmonyOS鸿蒙Next中web桥接h5,不支持callback回调与h5进行异步通信,如何解决 1、HarmonyOSweb桥接h5,不支持callback回调与h5进行异步通信,如何解决

2、HarmonyOS是否支持捕获指纹识别错误状态

5 回复

1. 关于HarmonyOS web桥接H5不支持callback回调与H5进行异步通信的解决方案

根据鸿蒙文档,HarmonyOS提供了多种机制来实现原生应用与H5页面之间的异步通信,包括使用回调(callback)方式。以下是基于文档的解决方案和实现方式:

支持的异步通信机制

  • WebMessagePort 接口(文档《arkts-apis-webview-WebMessagePort.md》):

    • 用于应用与HTML5页面双向通信,支持发送和接收消息(包括字符串、数组等数据类型)。
    • 通过 createWebMessagePorts 创建端口,使用 postMessageEvent 发送消息,onMessageEvent 接收消息(支持回调)。
    • 示例代码:
      // 在原生侧创建WebMessagePort并注册回调
      import webview from '@ohos.web.webview';
      
      let webMessagePorts: webview.WebMessagePort[] = webview.WebviewController.createWebMessagePorts();
      let port = webMessagePorts[0];
      
      // 注册消息回调
      port.onMessageEvent((event: webview.WebMessageEvent) => {
        console.log('Received message from H5: ' + event.getData());
      });
      
      // 发送消息到H5
      port.postMessageEvent('Hello from Native');
      
      // 在WebView中注入端口
      let controller: webview.WebviewController = new webview.WebviewController();
      controller.postMessage('port', [port], '*');
      
    • 在H5侧,可以通过JavaScript监听消息:
      window.addEventListener('message', (event) => {
        if (event.data === 'port') {
          let port = event.ports[0];
          port.onmessage = (e) => {
            console.log('Received from Native: ' + e.data);
          };
          port.postMessage('Hello from H5');
        }
      });
      
  • registerJavaScriptProxy 方法(文档《arkts-apis-webview-WebviewController.md》):

    • 允许原生应用将JavaScript对象注入到H5的window对象中,H5可以直接调用这些方法,支持同步和异步回调。
    • 方法参数支持Function和Promise,但注意:异步回调(Callback)不能有返回值,但可以通过Promise或事件机制实现异步通信。
    • 示例代码:
      // 原生侧注册JavaScript对象
      let controller: webview.WebviewController = new webview.WebviewController();
      let obj = {
        nativeMethod: (data: string, callback: (response: string) => void) => {
          // 处理数据并回调
          callback('Processed: ' + data);
        }
      };
      
      // 注册对象,指定方法列表
      controller.registerJavaScriptProxy(obj, 'nativeObj', ['nativeMethod'], ['nativeMethod']); // 同步和异步方法列表
      controller.refresh(); // 刷新生效
      
      // 在H5侧调用
      window.nativeObj.nativeMethod('Hello', (response) => {
        console.log('Response from Native: ' + response);
      });
      
  • postMessage 和 onMessage 事件(文档《ohos-atomicservice-AtomicServiceWeb.md》):

    • 通过AtomicServiceWeb组件,H5可以使用SDK的postMessage方法发送消息,原生应用通过onMessage回调接收。
    • 示例代码:
      // 原生侧
      import { AtomicServiceWeb, OnMessageEvent } from '@kit.ArkUI';
      
      @Entry
      @Component
      struct WebComponent {
        @State controller: AtomicServiceWebController = new AtomicServiceWebController();
      
        build() {
          Column() {
            AtomicServiceWeb({
              src: $rawfile("index.html"),
              controller: this.controller,
              onMessage: (event: OnMessageEvent) => {
                console.log('Received from H5: ' + JSON.stringify(event.data));
              }
            })
          }
        }
      }
      
      <!-- H5侧 -->
      <script>
        has.asWeb.postMessage({
          data: { key: 'value' },
          callback: (err, res) => {
            if (err) {
              console.error('Error: ' + err.message);
            } else {
              console.log('Response: ' + res);
            }
          }
        });
      </script>
      

解决建议

如果遇到callback回调不支持的问题,请检查以下点:

  • 确保使用正确的API:HarmonyOS的WebView通信API可能在不同版本中有变化,请根据文档使用推荐的方法(如WebMessagePort或registerJavaScriptProxy)。
  • 异步处理:如果使用registerJavaScriptProxy,异步方法需要通过Promise或回调函数处理,但注意回调不能返回值,而是通过事件或Promise传递结果。
  • 权限和配置:确保WebView设置正确,并只在可信的URL(如HTTPS)下使用这些功能,以避免安全风险。
  • 真机测试:部分功能(如DevEco Studio预览器)可能需真机验证,请在实际设备上测试。

2. 不支持捕获指纹识别错误状态

更多关于HarmonyOS鸿蒙Next中web桥接h5,不支持callback回调与h5进行异步通信,如何解决的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


【背景知识】 Web:提供具有网页显示能力的Web组件,@ohos.web.webview提供Web控制能力。

【参考方案】:

可参考H5页面Base64图片保存示例,基于Web组件,使用javaScriptProxy配置ArkTS与H5的双向通信能力,实现Base64类型图片在H5页面显示及长按保存到相册的功能。

  1. 基于Web显示H5页面,使用javaScriptProxy配置ArkTS与H5的双向通信能力,通过暴露给H5的方法,将Base64格式的图片数据返回至H5页面。
Web({ src: $rawfile('Photos.html'), controller: this.webController })
  .javaScriptProxy({
    // 配置ArkTS与H5的双向通信能力
    object: this.pictureManagement, // 注入ArkTS侧的对象实例
    name: 'picture', // H5侧调用时使用的对象名称
    methodList: ['chosePicture'], // 暴露给H5调用的方法列表
    controller: this.webController  // 绑定当前Web组件的控制器
  })
  1. 针对HarmonyOS系统 Web 桥接 H5 时无法使用 callback 回调的问题,推荐采用Promise 机制 + 事件监听替代传统回调。

  2. HarmonyOS不支持捕获指纹识别错误状态。

在HarmonyOS鸿蒙Next中,可通过WebMessagePort实现H5异步通信。替代callback方式,使用端口消息机制进行双向数据传递。具体步骤包括:在Web组件中创建MessagePort,通过postMessage()发送消息,H5侧通过监听message事件接收并处理。此方法符合鸿蒙Next的Web通信规范,支持异步交互。

在HarmonyOS Next中,Web桥接H5不支持callback回调机制,建议使用postMessage结合事件监听实现异步通信。具体可通过WebViewonMessage事件接收H5消息,并通过postMessage向H5发送数据,替代传统的callback方式。

关于指纹识别错误状态捕获,HarmonyOS支持通过@ohos.userAuth模块的onoff方法监听认证错误事件,可获取具体错误码和提示信息。需在auth接口调用时注册错误回调处理逻辑。

回到顶部