HarmonyOS鸿蒙Next原生应用如何与内嵌H5页面实现双向通信?

发布于 1周前 作者 zlyuanteng 来自 鸿蒙OS

HarmonyOS鸿蒙Next原生应用如何与内嵌H5页面实现双向通信? 鸿蒙原生应用如何与内嵌H5页面实现双向通信?

4 回复

更多关于HarmonyOS鸿蒙Next原生应用如何与内嵌H5页面实现双向通信?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙原生应用中与内嵌 H5 页面实现双向通信,可以通过以下几种方式实现:

1. 使用 DsBridge 第三方库

DsBridge 是一个强大的桥梁库,允许鸿蒙原生环境与 JavaScript 交互,支持同步和异步调用、命名空间 API 管理等功能。

原生侧代码示例:

import { JavaScriptInterface, WebViewControllerProxy } from '@hzw/ohos-dsbridge';

interface People {
  name: string;
  age: number;
}

@Entry
@Component
struct DsBridgePage {
  private controller: WebViewControllerProxy = WebViewControllerProxy.createController();
  private localPath = $rawfile('index.html');
  @State isLoading: boolean = true;
  @State peopleInfo: People = {
    name: '张三',
    age: 18,
  };

  aboutToAppear() {
    this.controller.addJavascriptObject(this);
    this.controller.setClosePageListener(() => {
      return true;
    });
  }

  aboutToDisappear() {
    this.controller.destroy();
  }

  registerShowHarmonyInfo() {
    this.controller.callJs('showAlert', [this.peopleInfo], (result: boolean) => {
      console.log('resultInfo-ShowAlert', result);
    });
  }

  @JavaScriptInterface(false)
  test(args: string): string {
    console.log('来自WebH5的参数', args);
    return `${JSON.stringify(this.peopleInfo)}`;
  }

  build() {
    Column() {
      Web({ src: this.localPath, controller: this.controller.getWebViewController() })
        .javaScriptAccess(true)
        .javaScriptProxy(this.controller.javaScriptProxy)
        .onAlert((event) => {
          return false;
        })
        .onPageEnd(() => {
          this.registerShowHarmonyInfo();
        })
        .onProgressChange((event) => {
          if (event?.newProgress == 100) {
            this.isLoading = false;
          }
        })
        .onConsole((event) => {
          console.info('getMessage:' + event?.message.getMessage());
          return false;
        })
        .width('100%')
        .height('100%')
        .backgroundColor("#ffeef5ee");
    }
    .height('100%')
    .width('100%');
  }
}

H5 侧代码示例:

document.addEventListener('DOMContentLoaded', () => {
  // 调用原生方法
  dsBridge.call('test', 'Hello from H5', (result) => {
    console.log('从原生返回的数据:', result);
  });
});

// 注册供原生调用的 JavaScript 方法
dsBridge.register('showAlert', (message) => {
  alert('从原生调用:' + message);
  return 'H5 响应';
});

2. 使用 Web 组件的 runJavaScriptjavaScriptProxy

通过 runJavaScript 方法,原生侧可以直接调用 H5 页面中的 JavaScript 方法。同时,通过 javaScriptProxy,H5 页面可以调用原生侧的方法。

原生侧代码示例:

import webview from '@ohos.web.webview';

@Entry
@Component
struct MyWeb {
  webController: webview.WebviewController = new webview.WebviewController();
  webUrl: string | Resource = "";

  build() {
    Column() {
      Web({ src: this.webUrl, controller: this.webController })
        .javaScriptProxy({
          object: {
            nativeMethod: (channelName: string, paramsCallback: IParamsCallback) => {
              if (!channelName || !paramsCallback) {
                return;
              }
              switch (channelName) {
                case "openNativePage":
                  paramsCallback.success();
                  console.log("luvi > h5调用 openNativePage 方法,携带参数" + paramsCallback.name);
                  break;
                case "getCity":
                  paramsCallback.success();
                  console.log("luvi > h5调用 getCity 方法,携带参数" + paramsCallback.name);
                  break;
                default:
                  break;
              }
            },
          },
          name: 'JSBridge',
          methodList: ['nativeMethod'],
          controller: this.webController,
        })
        .fileAccess(true)
        .domStorageAccess(true)
        .zoomAccess(false)
        .width("100%")
        .height("100%");
    };
  }
}

H5 侧代码示例:

function openNativePage() {
  window.JSBridge.nativeMethod("openNativePage", {
    success: function(res) {
      console.log("H5 > openNativePage success. " + res);
    },
    fail: function() {
      console.log("H5 > openNativePage fail.");
    }
  });
}

function getCity() {
  window.JSBridge.nativeMethod("getCity", {
    success: function(res) {
      console.log("H5 > getCity success. " + res);
    },
    fail: function() {
      console.log("H5 > getCity fail.");
    }
  });
}

3. 使用消息机制

通过 createMessagePorts 创建通信端口,原生侧和 H5 侧可以通过 postMessageonmessage 实现双向通信。

原生侧代码示例:

import webview from '@ohos.web.webview';

@Entry
@Component
struct MyWeb {
  webController: webview.WebviewController = new webview.WebviewController();
  webUrl: string | Resource = "";

  build() {
    Column() {
      Web({ src: this.webUrl, controller: this.webController })
        .onMessage((event) => {
          console.log('从 H5 收到的消息:', event.data);
        })
        .width("100%")
        .height("100%");
    };
  }

  aboutToAppear() {
    this.webController.createMessagePorts().then((ports) => {
      const [port1, port2] = ports;
      port1.onMessage = (event) => {
        console.log('从 H5 收到的消息:', event.data);
      };
      this.webController.postMessage(port2, 'Hello from Native');
    });
  }
}

H5 侧代码示例:

window.addEventListener('message', (event) => {
  console.log('从原生收到的消息:', event.data);
});

// 向原生发送消息
const port = new MessagePort();
port.postMessage('Hello from H5');

通过以上方法,可以在鸿蒙原生应用中与内嵌的 H5 页面实现高效的双向通信。

在HarmonyOS鸿蒙Next中,原生应用与内嵌H5页面实现双向通信可以通过以下方式:

  1. JSBridge机制:鸿蒙提供了JSBridge机制,允许原生代码与H5页面进行交互。原生应用可以通过WebView组件加载H5页面,并通过WebViewJavaScriptInterface接口暴露原生方法供H5调用。同时,H5页面可以通过window对象调用原生方法。

  2. 消息传递:使用WebView.postMessage方法,原生应用可以向H5页面发送消息,H5页面通过监听message事件接收消息并处理。同样,H5页面可以通过window.postMessage向原生应用发送消息,原生应用通过WebView.setWebMessageListener监听并处理消息。

  3. URL Scheme:H5页面可以通过修改window.location.href或触发特定URL Scheme的方式向原生应用传递数据。原生应用通过WebView.setWebViewClient监听URL变化并解析数据。

  4. WebSocket:原生应用和H5页面可以通过WebSocket建立双向通信通道,实时传递数据。

这些方法可以实现原生应用与H5页面的双向通信,具体实现需根据业务需求选择合适的方式。

在HarmonyOS鸿蒙Next中,原生应用与内嵌H5页面实现双向通信可以通过以下步骤:

  1. 原生调用H5:使用WebViewevaluateJavascript方法执行JavaScript代码,向H5页面传递数据或调用H5中的函数。

  2. H5调用原生:通过WebViewaddJavascriptInterface方法,将原生对象暴露给H5页面,H5页面可以通过该对象调用原生方法。

  3. 事件监听:在H5页面中监听原生事件,或在原生应用中监听H5页面的事件,实现双向通信。

  4. 数据传递:通过JSON格式传递数据,确保数据格式一致性和安全性。

通过这些方法,可以实现原生应用与H5页面的高效双向通信。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!