方舟web使用及数据双向通信

一、需解决的问题:

  1. 怎么加载本地html文件;
  2. 加载成功后应用端怎么调用js中的方法;
  3. js中怎么将数据传给应用端、或js端怎么调用应用端的数据。 参考地址:

二、怎么加载本地html文件

typescript 复制代码
import { webview } from "@kit.ArkWeb";

@Component
export struct MyPage {
  controller: webview.WebviewController = new webview.WebviewController();
  
  build() {
    Column() {
      Web({ src: $rawfile("map/index.html"), controller: this.controller })
        .onPageEnd(() => {
          // 推荐在此loadUrl、设置自定义用户代理、注入JS对象等
          this.controller.runJavaScript("setLatLonCenterNoMark(112.12853720100244,32.014796804669224,'8')");
          this.controller.runJavaScript("addYhdMark('YHD',112.12853720100244,32.014796804669224,'测试名称','#00ff00')");
        })
    }
  }
}

三、加载成功后应用端怎么调用js中的方法

可通过:

kotlin 复制代码
  this.controller.runJavaScript("")

直接引用js中的方法。

四、js中怎么将数据传给应用端、或js端怎么调用应用端的数据

有两种方法,我理解的分为:注册型与端口监听型,下面说说这两种方法的具体实现

1、注册型

应用侧代码:

scala 复制代码
import { webview } from "@kit.ArkWeb";
import { hilog } from "@kit.PerformanceAnalysisKit";

class TestClass {
  constructor() {
  }

  test(name:string): string {
    hilog.info(0,"测试",name)
    return 'ArkTS Hello World!';
  }
}
@Component
export struct MyPage {
  controller: webview.WebviewController = new webview.WebviewController();
  // 声明需要注册的对象
  @State testObj: TestClass = new TestClass();

  build() {
    Column() {
      Web({ src: $rawfile("map/index.html"), controller: this.controller })
        .onPageEnd(() => {
          // 推荐在此loadUrl、设置自定义用户代理、注入JS对象等
          this.controller.runJavaScript("setLatLonCenterNoMark(112.12853720100244,32.014796804669224,'8')");
          this.controller.runJavaScript("addYhdMark('YHD',112.12853720100244,32.014796804669224,'测试名称','#00ff00')");
        })
          // 将对象注入到web端
        .javaScriptProxy({
          object: this.testObj,
          name: "testObjName",
          methodList: ["test"],
          controller: this.controller,
          // 可选参数
          asyncMethodList: [],
          permission: '{"javascriptProxyPermission":{"urlPermissionList":[{"scheme":"resource","host":"rawfile","port":"","path":""},' +
            '{"scheme":"e","host":"f","port":"g","path":"h"}],"methodList":[{"methodName":"test","urlPermissionList":' +
            '[{"scheme":"https","host":"xxx.com","port":"","path":""},{"scheme":"resource","host":"rawfile","port":"","path":""}]},' +
            '{"methodName":"test11","urlPermissionList":[{"scheme":"q","host":"r","port":"","path":"t"},' +
            '{"scheme":"u","host":"v","port":"","path":""}]}]}}'
        })
    }
  }
}

js端调用应用端方法

2、监听型

主要是通过创建2个port,一个放在应用端使用,一个放在js端使用来达到互相通信

应用侧代码

typescript 复制代码
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { webview } from '@kit.ArkWeb';

@Component
export struct TxlPage {
  controller: webview.WebviewController = new webview.WebviewController();
  //第二种方法
  ports: webview.WebMessagePort[] = [];
  @State receivedFromHtml: string = 'Display received message send from HTML';
  @State sendFromEts: string = 'Send this message from ets to HTML';

  build() {
    Column() {
      Web({ src: $rawfile("map/index.html"), controller: this.controller })
        .onPageEnd(() => {
         // 推荐在此loadUrl、设置自定义用户代理、注入JS对象等
        this.controller.runJavaScript("setLatLonCenterNoMark(112.12853720100244,32.014796804669224,'8')");
        this.controller.runJavaScript("addYhdMark('YHD',112.12853720100244,32.014796804669224,'测试名称','#00ff00')");

          try {
            // 1、创建两个消息端口。
            this.ports = this.controller.createWebMessagePorts();
            if (this.ports && this.ports[0] && this.ports[1]) {
              // 2、在应用侧的消息端口(如端口1)上注册回调事件。
              this.ports[1].onMessageEvent((result: webview.WebMessage) => {
                let msg = 'Got msg from HTML:';
                if (typeof (result) === 'string') {
                  hilog.warn(0,'测试',`received string message from html5, string is: ${result}`);
                  msg = msg + result;
                } else if (typeof (result) === 'object') {
                  if (result instanceof ArrayBuffer) {
                    hilog.warn(0,'测试1',`received arraybuffer from html5, length is: ${result.byteLength}`);
                    msg = msg + 'length is ' + result.byteLength;
                  } else {
                    hilog.info(1,"",'not support');
                  }
                } else {
                  hilog.info(1,"",'not support');
                }
                this.receivedFromHtml = msg;
              })
              // 3、将另一个消息端口(如端口0)发送到HTML侧,由HTML侧保存并使用。
              this.controller.postMessage('__init_port__', [this.ports[0]], '*');
            } else {
              console.error(`ports is null, Please initialize first`);
            }
          } catch (error) {
            hilog.info(1,"",'初始化出错');
            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
          }
      })
    }
  }
}

js端

csharp 复制代码
//监听应用端发送过来的消息
var h5Port;
window.addEventListener('message', function (event) {
    if (event.data === '__init_port__') {
        if (event.ports[0] !== null) {
            h5Port = event.ports[0]; // 1. 保存从应用侧发送过来的端口。
            h5Port.onmessage = function (event) {
                // 2. 接收ets侧发送过来的消息。
                var msg = 'Got message from ets:';
                var result = event.data;
                if (typeof(result) === 'string') {
                    clearFeaturesByLayerName("select_point_name");
                    alert('received string message from html5, string is: ${result}');
                    msg = msg + result;
                } else if (typeof(result) === 'object') {
                    if (result instanceof ArrayBuffer) {
                        alert('received arraybuffer from html5, length is: ${result.byteLength}');
                        msg = msg + 'length is ' + result.byteLength;
                    } else {
                        alert('not support');
                    }
                } else {
                    alert('not support');
                }
            }
        }
    }
})

回传给应用端

觉得写得好麻烦点赞鼓励下,谢谢

相关推荐
ajassi200010 分钟前
开源 Arkts 鸿蒙应用 开发(十三)音频--MP3播放
linux·华为·开源·harmonyos
zhanshuo12 小时前
让鸿蒙应用丝滑如飞:绘图性能优化全攻略(附代码实战)
harmonyos
zhanshuo12 小时前
适配鸿蒙低性能设备的终极优化方案:从启动到渲染全链路实战
harmonyos
Georgewu12 小时前
【HarmonyOS】鸿蒙ArkWeb加载优化方案详解
harmonyos
Georgewu13 小时前
【HarmonyOS】鸿蒙应用HTTPDNS 服务集成详解
harmonyos
simple_lau16 小时前
鸿蒙 3D 开发实战:从模型加载到动画管理的完整实现
harmonyos·arkts·arkui
litongde17 小时前
React Native 编程
react native·harmonyos
程序员老刘18 小时前
“工信部要求9月30日前APP必须100%适配鸿蒙“ 是真的吗?
flutter·harmonyos
万少1 天前
AI编程神器!Trae+Claude4.0 简单配置 让HarmonyOS开发效率飙升 - 坚果派
前端·aigc·harmonyos