【HarmonyOS 5】金融应用开发鸿蒙组件实践

简介: 2024 年 1 月 18 日:发布 原生鸿蒙操作系统星河版,面向开发者开放申请,余承东宣布鸿蒙生态设备数达 8 亿台;建设银行、邮储银行等完成鸿蒙原生应用 Beta 版本开发。


##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财#

一、鸿蒙生态观察


2024 年 1 月 18 日:
发布 原生鸿蒙操作系统星河版,面向开发者开放申请,余承东宣布鸿蒙生态设备数达 8 亿台;建设银行、邮储银行等完成鸿蒙原生应用 Beta 版本开发。

2024 年 10 月 22 日:
HarmonyOS NEXT(鸿蒙 5.0) 发布,这是中国首个全栈自研操作系统,彻底脱离安卓,流畅度显著提升,标志中国在操作系统领域取得突破性进展。11 月 26 日,华为 Mate70 系列与 Mate X6 发布,到手即可升级原生鸿蒙系统。

2025 年 3 月:
原生鸿蒙正式版发布,HarmonyOS 5,发布Pura X 首款全面搭载 HarmonyOS 5 的阔折叠手机。

2025 年 5 月:
鸿蒙 PC 发布,从内核重构操作系统,由鸿蒙底座、生态和体验三大核心板块组成,实现国产操作系统在 PC 领域的重要突破。

根据 2025 年 5 月的信息,鸿蒙系统的设备装机量已超过 10 亿台。
国内鸿蒙化应用越来越多,外资例如汇丰,渣打今年都已启动鸿蒙项目。
从 BOSS 直聘、猎聘等平台信息来看,鸿蒙相关岗位丰富,薪资可观。

二、鸿蒙特性助力金融应用

TEE
Trusted Execution Environment,可信执行环境。
在主处理器中的一个安全区域,确保各种敏感数据在一个可信环境中被存储、处理和受到保护。

TEE为授权安全软件,也称为“可信应用”提供一个安全的执行环境,通过实施保护、保密性、完整性和数据访问权限确保端到端的安全。

人脸活体检测

华为提供活体检测安全组件,方便三方应用集成。

// 导入人脸识别功能模块
import { interactiveLiveness } from '@kit.VisionKit';
// 导入业务错误处理模块
import { BusinessError } from '@kit.BasicServicesKit';
// 导入日志记录模块
import { hilog } from '@kit.PerformanceAnalysisKit';
// 导入权限控制相关模块
import { abilityAccessCtrl, common } from '@kit.AbilityKit';
// 导入提示框组件
import { promptAction } from '@kit.ArkUI';
// 导入应用包管理模块
import { bundleManager } from '@kit.MDMKit';
/**
 * 人脸活体检测页面组件
 * 提供相机权限申请和交互式人脸活体检测功能
 */
@Entry
@Component
struct FaceLivenessPage {
  // 记录用户是否已授予相机权限的状态
  @State userGrant: boolean = false;
  /**
   * 向用户申请相机权限
   * @returns 权限申请结果数组,0表示授权成功
   */
  private async reqPermissionsFromUser(): Promise<number[]> {
    // 获取当前UI上下文
    let context = getContext() as common.UIAbilityContext;
    // 创建权限管理实例
    let atManager = abilityAccessCtrl.createAtManager();
    // 发起相机权限申请
    let grantStatus = await atManager.requestPermissionsFromUser(context, ['ohos.permission.CAMERA']);
    return grantStatus.authResults;
  }
  /**
   * 处理相机权限申请流程
   */
  private async requestCameraPermission() {
    // 获取权限申请结果
    let grantStatus = await this.reqPermissionsFromUser();
    // 遍历结果检查是否授权成功
    for (let i = 0; i < grantStatus.length; i++) {
      if (grantStatus[i] === 0) {
        // 授权成功,更新状态并提示用户
        this.userGrant = true;
        promptAction.showToast({
          message: "授权成功!"
        });
      }
    }
  }
  /**
   * 权限申请按钮点击事件处理函数
   */
  onClickPermission = () => {
    this.requestCameraPermission();
  }
  /**
   * 人脸活体检测按钮点击事件处理函数
   */
  onClickFaceLiv = () => {
    // 检查是否有相机权限
    if (!this.userGrant) {
      promptAction.showToast({
        message: "无相机权限!"
      });
      return;
    }
    // 配置活体检测模式为交互式
    let isSilentMode = "INTERACTIVE_MODE" as interactiveLiveness.DetectionMode;
    // 配置需要完成的动作数量为3个
    let actionsNum = 3 as interactiveLiveness.ActionsNumber;
    // 配置活体检测参数
    let routerOptions: interactiveLiveness.InteractiveLivenessConfig = {
      actionsNum: actionsNum,         // 动作数量
      isSilentMode: isSilentMode,     // 检测模式
      routeMode: "back" as interactiveLiveness.RouteRedirectionMode // 检测完成后返回方式
    };
    
    // 启动人脸活体检测
    interactiveLiveness.startLivenessDetection(routerOptions, (err: BusinessError, result: interactiveLiveness.InteractiveLivenessResult | undefined) => {
      if (err.code !== 0 && !result) {
        // 检测失败,记录错误日志
        hilog.error(0x0001, "LivenessCollectionIndex", `Failed to detect. Code:${err.code},message:${err.message}`);
        return;
      }
      // 检测成功,记录结果日志并提示用户
      hilog.info(0x0001, 'LivenessCollectionIndex', `Succeeded in detecting result:${JSON.stringify(result)}`);
      promptAction.showToast({
        message: JSON.stringify(result)
      });
    });
  }
  /**
   * 定义按钮通用样式
   */
  @Styles commonText() {
    .width(px2vp(600))      // 设置宽度
    .height(px2vp(120))     // 设置高度
    .backgroundColor(Color.Blue) // 设置背景色
    .borderRadius(15)       // 设置圆角
  }
  /**
   * 组件UI构建函数
   */
  build() {
    Column() {
      // 权限申请按钮
      Text("请求相机权限")
        .fontColor(Color.White)
        .textAlign(TextAlign.Center)
        .commonText()           // 应用通用样式
        .onClick(this.onClickPermission) // 绑定点击事件
        .margin({
          bottom: px2vp(60)     // 设置底部边距
        })
      // 人脸检测按钮
      Text("人脸活体检测")
        .fontColor(Color.White)
        .textAlign(TextAlign.Center)
        .commonText()           // 应用通用样式
        .onClick(this.onClickFaceLiv)   // 绑定点击事件
    }
    .height('100%')           // 设置高度为全屏
    .width('100%')            // 设置宽度为全屏
    .justifyContent(FlexAlign.Center) // 垂直居中对齐
    .backgroundColor(Color.Black)     // 设置背景色
  }
}

图片筛选


隐私安全提升,比业内Android和IOS更加保护用户隐私与安全。

import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { BusinessError } from '@kit.BasicServicesKit';
/**
 * 相册图片选择
 */
@Entry
@Component
struct AlbumPage {
  private TAG: string = "AlbumPage";
  onClickSelectPhoto = ()=>{
    try {
      let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
      // 设置筛选过滤条件
      PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
      // 选择用户选择数量
      PhotoSelectOptions.maxSelectNumber = 1;
      // 添加图片目标筛选类型
      let recommendOptions: photoAccessHelper.RecommendationOptions = {
        recommendationType: photoAccessHelper.RecommendationType.ID_CARD | photoAccessHelper.RecommendationType.BANK_CARD | photoAccessHelper.RecommendationType.QR_CODE
      }
      PhotoSelectOptions.recommendationOptions = recommendOptions;
      // 实例化图片选择器
      let photoPicker = new photoAccessHelper.PhotoViewPicker();
      // 唤起安全相册组件
      photoPicker.select(PhotoSelectOptions, (err: BusinessError, PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {
        if (err) {
          console.error(this.TAG, "onClickSelectPhoto photoPicker.select error:" + JSON.stringify(err));
          return;
        }
        // 用户选择确认后,会回调到这里。
        console.info(this.TAG, "onClickSelectPhoto photoPicker.select successfully:" + JSON.stringify(PhotoSelectResult));
      });
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error(this.TAG, "onClickSelectPhoto photoPicker.select catch failed:" + JSON.stringify(err));
    }
  }
  build() {
    Row(){
      Button('点击唤起相册选择')
        .onClick(this.onClickSelectPhoto)
    }
    .justifyContent(FlexAlign.Center)
    .size({
      width: "100%",
      height: "100%"
    })
  }
}

扫一扫

系统提供安全扫码控件,简单几句代码即可集成扫码界面与解析。
扫码界面内完整集成图库选取,闪光灯补光,图片扫码,实时扫码。

import { scanBarcode, scanCore } from '@kit.ScanKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI';
@Entry
@Component
struct ScanPage {
  private TAG: string = "Index";
  private onToEasyScan = () => {
    let options: scanBarcode.ScanOptions = {
      scanTypes: [scanCore.ScanType.ALL],
      enableMultiMode: true,
      enableAlbum: true
    };
    scanBarcode.startScanForResult(getContext(this), options).then((result: scanBarcode.ScanResult) => {
      // 扫码解析成功,二维码数据
      console.info(this.TAG, " result: " + JSON.stringify(result));
      promptAction.showToast({
        message: result.originalValue
      });
    }).catch((error: BusinessError) => {
      // 扫码解析失败
      console.info(this.TAG, " error: " + JSON.stringify(error));
    });
  }
  build() {
    RelativeContainer() {
      Text("跳转一键扫码")
        .id('HelloWorld')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(this.onToEasyScan)
    }
    .height('100%')
    .width('100%')
  }
}


三、开发问题定位和解决方案分享

鸿蒙开发经验分享

1、如何高效的学习鸿蒙?
所谓知其然,才能知其所以然,先进行鸿蒙整体概念的入门和学习,了解鸿蒙相关的专有名词是非常重要。

1.1、专有名词介绍:
鸿蒙
特指HarmonyOS与OpenHarmony,前者是商业鸿蒙,是华为公司使用和维护的系统。后者是HW开源给开放原子基金协会的系统,任何人遵守开源协议,都可以使用和改造的系统。

HarmonyOS虽然基座是OpenHarmony,但是上层功能和使用差异也还是有的。两者虽然近似,但是并非一个东西。
两者区别详情参见:OpenHarmony和HarmonyOS区别与共性

鸿蒙相关公司
目前使用和维护开源鸿蒙OpenHarmony成长的公司有很多,例如深开鸿,润开鸿,鸿湖万联,开鸿智谷,九联开鸿等。开源鸿蒙的现在使用方向很多,例如电网,工业,物联,矿产等等。
商业鸿蒙,是华为公司自己进行迭代和维护与使用。

鸿蒙北向和南向
特指,北向应用开发,南向设备开发。设备开发多是基于开源鸿蒙。北向分OpenHarmony应用开发和HarmonyOS应用开发。

鸿蒙双框架和单框架
在 HarmonyOS NEXT 发布之前,华为手机运行的是 “双框架” 系统。其架构逻辑是鸿蒙和安卓框架共同存在,但底层基础服务仍以鸿蒙为核心,也被称为 “杂交系统”。单框架:以 HarmonyOS NEXT 为代表,是纯血鸿蒙系统,底座全线自研,去掉了传统的安卓开放源代码项目(AOSP)代码,只支持鸿蒙内核及鸿蒙系统的应用

鸿蒙HDE
华为开发者专家(HUAWEI DEVELOPER EXPERTS),经过华为官方认证。他们是华为开放能力的实践领袖,肩负着技术布道、知识赋能等责任,会在各大技术社区解答用户有关华为开发能力的相关问题,定期在社交媒体上进行线上分享,也常在线下以讲师身份分享关于华为最新技术趋势讲解。

2、建立鸿蒙知识框架
我向来建议大家,建立鸿蒙的学习框架,首先了解鸿蒙是什么,能做什么,都有什么功能。新特性是什么?与Android和IOS的区别在哪?

只有充分解构学习目标之后,才能更有动力,更有方向的去学习鸿蒙。

综上所述,现在我们来看官方的文档,就明白如何去学习使用了。

版本说明,是鸿蒙迭代版本的详细说明,从这里我们可以了解到,鸿蒙最新的技术迭代方向,和某些老技术废弃的原因。及时调整自己的学习方向和开发方案。

指南作为开发功能的概述,会有完整的demo代码片段,当你需要更详细的接口文档时,就需要点击API参考进行查看。

最佳实践和FAQ作为开发方案的技术范本和常规问题规避,可以理解为踩坑文档。

鸿蒙快速迭代如何不掉队?
因为鸿蒙在快速成长,API迭代速度很快。很多组件,路由管理,状态装饰器都在快速进化中。有的就被废弃了,需要快速学习新的方案。所以对持续学习的要求很高。

建议进行知识框架的搭建,例如通过思维导图,个人知识库,定期学习官方文档进行知识的迭代。在工作开发中,经常自我总结,归纳鸿蒙相关的技能和解决方案。

目录
相关文章
|
13天前
|
开发者 容器
鸿蒙应用开发从入门到实战(十四):ArkUI组件Column&Row&线性布局
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解Column和Row组件的使用以及线性布局的方法。
108 12
|
14天前
|
API 数据处理
鸿蒙应用开发从入门到实战(十三):ArkUI组件Slider&Progress
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解滑块Slider和进度条Progress组件的使用。
|
4月前
|
JavaScript 开发工具 开发者
【HarmonyOS 5】鸿蒙Web组件和内嵌网页双向通信DEMO示例
【HarmonyOS 5】鸿蒙Web组件和内嵌网页双向通信DEMO示例
102 3
|
4月前
|
开发者
鸿蒙仓颉开发语言实战教程:自定义组件
本文介绍了如何在仓颉开发语言中创建自定义组件,以封装和管理项目中的 tabbar 组件为例。通过创建独立的组件文件 yltabbar.cj,并使用 @Component 和 @Link 等修饰符实现组件化开发与参数传递,提升代码复用性和项目可维护性。适合希望深入掌握仓颉语言组件开发的 HarmonyOS 开发者学习参考。 #HarmonyOS #仓颉 #购物
|
16天前
|
数据安全/隐私保护 开发者
鸿蒙应用开发从入门到实战(十一):ArkUI组件Text&TextInput
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解文本组件Text和TextInput的使用。
110 3
|
缓存 数据安全/隐私保护 JavaScript
【HarmonyOS 5】鸿蒙页面和组件生命周期函数
【HarmonyOS 5】鸿蒙页面和组件生命周期函数
176 0
|
4月前
|
存储 IDE 定位技术
【HarmonyOS 5】鸿蒙组件&模板服务详解 - 助力高效开发的利器
在移动应用开发领域,效率与质量始终是开发者追求的核心目标。鸿蒙系统作为新兴的操作系统,为开发者提供了丰富且强大的开发资源,其中鸿蒙组件&模板服务更是成为开发者快速构建高质量应用的得力助手。
138 0
鸿蒙仓颉语言开发教程:页面和组件的生命周期
仓颉语言中的生命周期指页面或组件从加载到消失的过程。与ArkTs不同,仓颉需在生命周期方法前添加`protected open`修饰符,如`aboutToAppear()`、`onPageShow()`等。部分函数如`onBackPress()`返回布尔值,决定是否拦截系统返回操作。仅`@Entry`组件支持全部生命周期,普通组件仅支持`aboutToAppear`和`aboutToDisappear`。掌握正确写法可避免踩坑。
|
4月前
|
缓存
鸿蒙5开发宝藏案例分享---Swiper组件性能优化实战
本文分享了鸿蒙系统中Swiper组件的性能优化技巧,包括:1) 使用`LazyForEach`替代`ForEach`实现懒加载,显著降低内存占用;2) 通过`cachedCount`精准控制缓存数量,平衡流畅度与内存消耗;3) 利用`onAnimationStart`在抛滑时提前加载资源,提升构建效率;4) 添加`@Reusable`装饰器复用组件实例,减少创建开销。实际应用后,图库页帧率从45fps提升至58fps,效果显著。适合处理复杂列表或轮播场景,欢迎交流经验!
|
14天前
|
API 数据处理
鸿蒙应用开发从入门到实战(十三):ArkUI组件Slider&Progress
ArkUI提供滑块Slider与进度条Progress组件,用于鸿蒙原生APP开发。Slider支持拖动调节音量、亮度等,可设步长、方向及提示气泡;Progress支持线性、环形等多种样式,可自定义颜色、宽度与刻度,实时显示任务进度。
110 2