最受欢迎的三方库之harmony-web

2025-06-24 22:26:04
170次阅读
0个评论
最后修改时间:2025-07-20 15:52:24

harmony-web (API12)

🏆简介与推荐

harmony-web 是一款基于鸿蒙 WebView 打造的功能强大且极易上手的库,它不仅轻巧灵便、灵活度极高,还提供了一系列针对鸿蒙 WebView 的问题解决方案,助力开发者轻松应对各类开发挑战。

harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用。

harmony-dialog 一款极为简单易用的零侵入弹窗,仅需一行代码即可轻松实现,无论在何处都能够轻松弹出。

🌞下载安装

ohpm i @pura/harmony-web

OpenHarmony ohpm 环境配置等更多内容,请参考如何安装 OpenHarmony ohpm 包

📚 ArkWeb 组件,参数说明

名称 类型 描述 是否必选
controller webview.WebviewController 控制器 Y
src ResourceStr 网页资源地址 Y
options ArkWebOptions ArkWeb属性参数 N
webClient ArkWebClient ArkWeb生命周期事件 N
arkJsObject ArkJsObject 或 ArkJsObject[] 需要注册的接口对象 N

📚 ArkWebHelper,方法说明

方法名 介绍
init 初始化
prepareForPageLoad 预连接url,在加载url之前调用此API

📚示例代码

@Entry
@ComponentV2
struct Index {
  private controller: webview.WebviewController = new webview.WebviewController();
  @Local webUrl: string = "";
  @Local options: ArkWebOptions = new ArkWebOptions();
  @Local webClient: MyWebClient = new MyWebClient();
  @Local jsObject: MyJsObject = new MyJsObject();

  onBackPress(): boolean {
    if (this.controller?.accessBackward()) {
      this.controller?.backward();
      return true;
    }
    return false;
  }

  aboutToAppear(): void {
    let params: Params = router.getParams() as Params;
    this.webUrl = params.webUrl;
  }

  build() {
    Column() {
      ArkWeb({
        controller: this.controller,
        src: this.webUrl,
        options: this.options,
        webClient: this.webClient,
        arkJsObject: this.jsObject
      })
    }
    .height('100%')
    .width('100%')
  }

}


import { router } from '@kit.ArkUI';
import { ArkJsObject } from '@pura/harmony-web';
import { JSONUtil, LogUtil } from '@pura/harmony-utils';
import { User } from '../model/User';


/**
 * JS交互 */
export class MyJsObject extends ArkJsObject {

  //关闭页面
  closePage(str?: string) {
    LogUtil.error(`closePage: ${str}`);
    router.back();
  }

  async onDemo() {
    let user: User = new User();
    let str: string = JSONUtil.beanToJsonStr(user);

    this.runJavaScriptFun("onH5Demo", str ).then((data)=>{
      LogUtil.error(`网页回传值:${data}`);
    });
  }

}



import { ImageUtil, LogUtil } from '@pura/harmony-utils';
import { ArkWebClient } from '@pura/harmony-web';
import { webview } from '@kit.ArkWeb';
import { Utils } from './Utils';
import { DialogHelper } from '@pura/harmony-dialog';
import { cameraPicker } from '@kit.CameraKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { CameraOptions, PickerUtil } from '@pura/picker_utils';

/**
 * Web事件 */
export class MyWebClient implements ArkWebClient {
  controller?: webview.WebviewController;

  private onPageBeginCallback?: Callback<OnPageBeginEvent>;

  setOnPageBegin(onPageBeginCallback: Callback<OnPageBeginEvent>) {
    this.onPageBeginCallback = onPageBeginCallback;
  }


  setWebviewController(controller: webview.WebviewController): void {
    this.controller = controller;
  }

  onControllerAttached(): void {
    //重新定义UserAgent,在原来的UserAgent的上拼接“Linux”,这样就能调用原来Android的JS方法
    this.controller?.setCustomUserAgent(`${this.controller?.getUserAgent()},Linux`)
  }

  onPageBegin(event: OnPageBeginEvent): void {
    this.onPageBeginCallback?.(event);
    LogUtil.info(`onPageBegin => ` + event.url);
  }


  //文件选择
  onShowFileSelector(event: OnShowFileSelectorEvent): boolean {
    const isCapture = event.fileSelector.isCapture(); //是否拍照/拍视频
    if (isCapture) { //拍照/拍视频
      PickerUtil.cameraEasy().then((result) => {
        event.result.handleFileList([result]);
      });
    } else {
      const types = event.fileSelector.getAcceptType() ?? [];
      const mode = event.fileSelector.getMode();
      const isPhoto = Utils.isPhoto(types);
      const isVideo = Utils.isVideo(types);
      if (isPhoto || isVideo) { //图片、视频
        let sheets = isPhoto ? ["拍照", "选择照片"] : ["拍视频", "选择视频"];
        DialogHelper.showActionSheetDialog({
          title: "请选择",
          sheets: sheets,
          onAction: (action) => {
            if (action === 0) {
              let options = new CameraOptions();
              options.mediaTypes = isPhoto ? [cameraPicker.PickerMediaType.PHOTO] : [cameraPicker.PickerMediaType.VIDEO];
              PickerUtil.cameraEasy(options).then((result) => {
                if (isPhoto) { //对拍照的图片进行压缩,压缩到3M以内
                  ImageUtil.compressPhoto(result, 1024 * 3).then((path) => {
                    event.result.handleFileList([path]);
                  }).catch((err: BusinessError) => {
                    event.result.handleFileList([result]); //图片压缩异常时,使用原图。
                    LogUtil.error(`拍照图片压缩异常:${err.code} - ${err.message}`);
                  });
                } else {
                  event.result.handleFileList([result]);
                }
              });
            } else {
              PickerUtil.selectDocument({
                maxSelectNumber: mode === FileSelectorMode.FileOpenMode ? 1 : 9,
                fileSuffixFilters: types
              }).then((result) => {
                event.result.handleFileList(result);
              })
            }
          }
        })
      } else { //文档
        PickerUtil.selectDocument({
          maxSelectNumber: mode === FileSelectorMode.FileOpenMode ? 1 : 9,
          fileSuffixFilters: types
        }).then((result) => {
          event.result.handleFileList(result);
        })
      }
    }
    return true;
  }

}

🍎沟通与交流🙏

使用过程中发现任何问题都可以提 Issue 给我们;
当然,我们也非常欢迎你给我们发 PR

https://gitee.com/tongyuyan/harmony-utils
https://github.com/787107497

🌏开源协议

本项目基于 Apache License 2.0 ,在拷贝和借鉴代码时,请大家务必注明出处。

收藏00

登录 后评论。没有帐号? 注册 一个。