HarmonyOS全链路盯盘开发:锁屏卡片与防窥保护隐私方案

发表于 CSDN 精选专栏 | 阅读建议:20分钟 | 难度:进阶

在这里插入图片描述

前言

在移动互联网高度发达的今天,金融隐私安全已成为用户最为关切的问题之一。想象一下这样的场景:你在地铁上查看股票账户,身旁的陌生人不经意间瞥见了你的持仓信息;或者你将手机放在办公桌上,锁屏状态下的行情卡片被路过的同事一览无余。这些看似微小的瞬间,都可能成为隐私泄露的隐患。

HarmonyOS全链路盯盘方案不仅关注功能的完整性,更将隐私保护作为核心设计原则。通过锁屏卡片防窥保护两大系统级能力的深度整合,HarmonyOS为金融类应用构建了一道从"锁屏展示"到"防窥感知"的全方位隐私防护屏障。

本文将深入解析锁屏卡片的配置开发、防窥保护的状态监听与蒙层拉起机制,以及待机屏保卡片的适配方案。无论你是关注用户隐私安全的开发者,还是希望提升应用专业度的产品经理,本文都将为你提供系统性的技术实现路径。


一、锁屏盯盘核心概念与场景价值

1.1 锁屏卡片的定义与适用场景

锁屏卡片是HarmonyOS从API version 18开始提供的一项系统级能力,允许应用在设备锁屏界面上展示卡片内容。用户无需解锁手机,即可通过锁屏卡片获取关键信息或执行快捷操作。

在盯盘场景中,锁屏卡片的价值尤为突出:

  • 行情速览:用户点亮屏幕即可查看自选股最新价格与涨跌幅
  • 快捷操作:支持在锁屏界面执行一键刷新、切换股票等轻量交互
  • 信息触达:通过浅层信息持续获得用户关注,吸引用户复访应用

1.2 防窥保护的技术原理

防窥保护是HarmonyOS 6.0.0 Beta1引入的AI隐私防护功能。该功能通过多维度传感器数据融合分析,智能判断当前是否存在窥视风险:

  1. 人脸距离检测:通过前置摄像头与距离传感器判断人脸与屏幕的距离
  2. 注视角度分析:AI模型实时分析人脸朝向与注视角度
  3. 环境光线感知:结合环境光传感器判断使用场景
  4. 机主身份识别:将长期通过人脸解锁的用户设为机主,非机主状态触发防护

当系统判定存在窥视风险时,会自动拉起系统级隐私蒙层,遮盖应用窗口内容,同时隐藏个性化推荐、浏览记录、支付信息等敏感数据。

1.3 全链路盯盘的隐私能力矩阵

能力名称 API版本 防护场景 技术实现
锁屏卡片 5.1.0(18)+ 锁屏界面信息展示 Form Kit卡片服务
防窥保护 6.0.0(20)+ 使用中被旁人窥视 Device Security Kit
待机屏保 6.1.0(23)+ 充电待机状态展示 Form Kit待机屏保卡片
隐私蒙层 6.0.0(20)+ 非机主状态自动遮盖 系统级PeepMaskLayer

提示:防窥保护功能需要设备硬件支持相关传感器,且用户需在"设置 > 隐私与安全 > 防窥保护"中手动开启。开发前务必通过API检测设备能力可用性。


二、锁屏卡片开发全流程

2.1 锁屏卡片的约束与限制

在开始开发前,需要明确锁屏卡片的约束条件:

  • 设备限制:仅手机、平板设备支持
  • 尺寸限制:只支持 1x11x2 两种尺寸规格
  • 内容规范:不推荐展示涉及用户的隐私敏感数据
  • 能力申请:锁屏卡片属于上架开放能力,需手动申请并通过审核

2.2 工程配置与权限声明

锁屏卡片的开发基于Form Kit(卡片开发服务),首先需要在module.json5中声明卡片能力:

{
  "module": {
    "name": "entry",
    "type": "entry",
    "extensionAbilities": [
      {
        "name": "EntryFormAbility",
        "srcEntry": "./ets/entryformability/EntryFormAbility.ets",
        "label": "$string:EntryFormAbility_label",
        "description": "$string:EntryFormAbility_desc",
        "type": "form",
        "metadata": [
          {
            "name": "ohos.extension.form",
            "resource": "$profile:form_config"
          }
        ]
      }
    ]
  }
}

2.3 锁屏卡片配置文件

resources/base/profile/form_config.json中,需要特别配置renderingModesupportDimensions字段:

{
  "forms": [
    {
      "name": "StockLockScreenWidget",
      "displayName": "$string:widget_display_name",
      "description": "$string:widget_desc",
      "src": "./ets/widget/pages/StockLockScreenCard.ets",
      "uiSyntax": "arkts",
      "isDynamic": true,
      "isDefault": true,
      "updateEnabled": true,
      "scheduledUpdateTime": "10:30",
      "updateDuration": 1,
      "renderingMode": "autoColor",
      "defaultDimension": "1*2",
      "supportDimensions": [
        "1*1",
        "1*2"
      ]
    }
  ]
}

配置字段说明:

字段名 说明 锁屏卡片要求
renderingMode 渲染模式 仅支持singleColorautoColor
supportDimensions 支持的尺寸 必须包含1*11*2
updateDuration 更新周期 建议设置为1(每小时更新)或根据行情频率调整
isDynamic 是否动态卡片 动态卡片支持主动刷新,推荐设为true

提示:renderingMode字段在API version 18前后有不同的配置方式。18及以上版本直接配置字符串值,18之前版本需通过metadata数组配置。开发时务必根据目标API版本选择正确的配置方式。

2.4 锁屏卡片UI实现

以下是1x2尺寸股票行情锁屏卡片的完整实现:

// ets/widget/pages/StockLockScreenCard.ets

@Entry
@Component
struct StockLockScreenCard {
  // 行情数据
  @State stockName: string = '贵州茅台';
  @State stockCode: string = '600519';
  @State currentPrice: string = '1688.88';
  @State priceChange: string = '+2.35%';
  @State isRising: boolean = true;

  build() {
    Column() {
      // 股票名称与代码
      Row() {
        Text(this.stockName)
          .fontSize(14)
          .fontWeight(FontWeight.Bold)
          .fontColor(Color.White)
          .maxLines(1)
          .textOverflow({ overflow: TextOverflow.Ellipsis })
        
        Text(`(${this.stockCode})`)
          .fontSize(12)
          .fontColor('#CCCCCC')
          .margin({ left: 4 })
      }
      .width('100%')
      .justifyContent(FlexAlign.Start)

      // 价格与涨跌幅
      Row() {
        Text(`¥${this.currentPrice}`)
          .fontSize(24)
          .fontWeight(FontWeight.Bold)
          .fontColor(Color.White)
        
        Text(this.priceChange)
          .fontSize(14)
          .fontColor(this.isRising ? '#FF4444' : '#00C853')
          .margin({ left: 8 })
          .padding({ left: 6, right: 6, top: 2, bottom: 2 })
          .backgroundColor(this.isRising ? 'rgba(255,68,68,0.2)' : 'rgba(0,200,83,0.2)')
          .borderRadius(4)
      }
      .width('100%')
      .justifyContent(FlexAlign.Start)
      .margin({ top: 8 })

      // 更新时间
      Text('更新于 14:32:18')
        .fontSize(10)
        .fontColor('#999999')
        .margin({ top: 6 })
        .width('100%')
        .textAlign(TextAlign.Start)
    }
    .width('100%')
    .height('100%')
    .padding(12)
    .backgroundColor('#1A1A2E')
    .borderRadius(8)
  }
}

2.5 锁屏卡片数据刷新机制

锁屏卡片支持两种数据更新方式:

  1. 定时更新:通过updateDuration配置定时刷新周期
  2. 主动刷新:通过Form Kit提供的updateForm接口主动推送数据
import { formProvider } from '@kit.FormKit';
import { BusinessError } from '@kit.BasicServicesKit';

/**
 * 主动刷新锁屏卡片数据
 * @param formId 卡片实例ID
 * @param stockData 行情数据
 */
async function updateLockScreenCard(
  formId: string, 
  stockData: StockData
): Promise<void> {
  let formData = formBindingData.createFormBindingData({
    stockName: stockData.name,
    stockCode: stockData.code,
    currentPrice: stockData.price,
    priceChange: stockData.change,
    isRising: stockData.change.startsWith('+')
  });

  try {
    await formProvider.updateForm(formId, formData);
    console.info(`Succeeded in updating form: ${formId}`);
  } catch (error) {
    console.error(`Failed to update form: ${error.code}, ${error.message}`);
  }
}

三、锁屏卡片开放能力申请

3.1 申请流程详解

锁屏卡片属于上架开放能力,需要开发者手动申请并通过审核。申请流程如下:

  1. 登录AppGallery Connect:访问华为开发者联盟,进入"我的项目"
  2. 选择目标应用:在项目列表中找到需要开启开放能力的应用
  3. 进入开放能力管理:选择"开发与服务 > 开放能力管理"
  4. 提交锁屏卡片申请:点击锁屏卡片对应的"申请"按钮
  5. 填写申请信息
    • 申请原因:必填,包括应用介绍、使用场景、申请用途,不超过256个字符
    • 上传附件:选填,提供卡片UI设计释义材料,大小不超过500MB
  6. 等待审核:1-3个工作日反馈申请结果
  7. 能力开通:审核通过后,勾选锁屏卡片能力开关并保存

3.2 手动签名配置

由于锁屏卡片涉及系统级开放能力,应用调试和发布时必须使用手动签名

// 在 DevEco Studio 的 signingConfigs 中配置手动签名
{
  "signingConfigs": [
    {
      "name": "default",
      "type": "manual",
      "material": {
        "certpath": "./keys/lockscreen-release.cer",
        "storePassword": "******",
        "keyAlias": "lockscreen_key",
        "keyPassword": "******",
        "profile": "./keys/lockscreen-release.p7b",
        "signAlg": "SHA256withECDSA",
        "storeFile": "./keys/lockscreen-release.p12"
      }
    }
  ]
}

提示:在申请Profile过程中创建HarmonyOS应用时,务必同步申请锁屏卡片开放能力,否则即使代码开发完成也无法在真机上正常运行。


四、防窥保护开发实战

4.1 防窥保护能力检测

在集成防窥保护前,需要先检测当前设备是否支持该能力,以及用户是否已开启功能开关:

import { dlpAntiPeep } from '@kit.DeviceSecurityKit';
import { window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

/**
 * 防窥保护管理类
 * 负责防窥状态的检测、订阅、响应与释放
 */
export class AntiPeepManager {
  private static instance: AntiPeepManager;
  private maskWindowId: number = -1;
  private isSubscribed: boolean = false;

  static getInstance(): AntiPeepManager {
    if (!AntiPeepManager.instance) {
      AntiPeepManager.instance = new AntiPeepManager();
    }
    return AntiPeepManager.instance;
  }

  /**
   * 检查防窥保护是否可用
   * @returns 是否支持防窥保护
   */
  async isAntiPeepAvailable(): Promise<boolean> {
    try {
      // 检查设备是否支持防窥保护
      const isSupported = dlpAntiPeep.isSupported();
      if (!isSupported) {
        console.info('AntiPeep is not supported on this device');
        return false;
      }

      // 检查用户是否开启了防窥保护开关
      const isEnabled = await dlpAntiPeep.isEnabled();
      console.info(`AntiPeep enabled status: ${isEnabled}`);
      return isEnabled;
    } catch (error) {
      console.error(`Failed to check antiPeep availability: ${error.code}`);
      return false;
    }
  }
}

4.2 防窥状态订阅与蒙层拉起

防窥保护的核心开发流程包括三个步骤:订阅状态变化拉起隐私蒙层响应状态变更

import { dlpAntiPeep } from '@kit.DeviceSecurityKit';
import { window } from '@kit.ArkUI';

export class AntiPeepManager {
  // ... 前述代码

  /**
   * 注册防窥保护状态监听
   * 当检测到窥视风险时,自动拉起隐私蒙层
   */
  async subscribeAntiPeepState(): Promise<void> {
    if (this.isSubscribed) {
      console.info('AntiPeep state already subscribed');
      return;
    }

    try {
      // 订阅防窥保护状态变化
      dlpAntiPeep.on('peepStateChange', (peepState: dlpAntiPeep.PeepState) => {
        console.info(`Peep state changed: ${JSON.stringify(peepState)}`);
        
        if (peepState.isPeeping) {
          // 检测到窥视行为,拉起隐私蒙层
          this.showAntiPeepMask();
        } else {
          // 窥视行为解除,关闭隐私蒙层
          this.hideAntiPeepMask();
        }
      });

      this.isSubscribed = true;
      console.info('Succeeded in subscribing antiPeep state');
    } catch (error) {
      console.error(`Failed to subscribe antiPeep: ${error.code}, ${error.message}`);
    }
  }

  /**
   * 拉起系统级隐私蒙层
   * 遮盖应用窗口内容,防止信息泄露
   */
  private async showAntiPeepMask(): Promise<void> {
    try {
      // 获取当前应用窗口ID
      const mainWindow = await window.getLastWindow(getContext());
      this.maskWindowId = mainWindow.getWindowProperties().id;

      // 拉起系统防窥蒙层
      await dlpAntiPeep.setAntiPeepMaskLayer(this.maskWindowId, {
        maskColor: '#000000',
        maskOpacity: 0.85,
        showWarningTip: true,
        warningTipText: '检测到他人窥视,已自动隐藏内容'
      });

      console.info('AntiPeep mask layer shown');
    } catch (error) {
      console.error(`Failed to show antiPeep mask: ${error.code}`);
    }
  }

  /**
   * 隐藏隐私蒙层
   * 恢复正常内容显示
   */
  private async hideAntiPeepMask(): Promise<void> {
    if (this.maskWindowId === -1) {
      return;
    }

    try {
      await dlpAntiPeep.passDlpAntiPeepInfo(this.maskWindowId, {
        isPeeping: false
      });
      
      this.maskWindowId = -1;
      console.info('AntiPeep mask layer hidden');
    } catch (error) {
      console.error(`Failed to hide antiPeep mask: ${error.code}`);
    }
  }

  /**
   * 取消防窥状态订阅
   * 应在页面销毁或应用退出时调用
   */
  unsubscribeAntiPeepState(): void {
    if (!this.isSubscribed) {
      return;
    }

    try {
      dlpAntiPeep.off('peepStateChange');
      this.isSubscribed = false;
      console.info('Succeeded in unsubscribing antiPeep state');
    } catch (error) {
      console.error(`Failed to unsubscribe antiPeep: ${error.code}`);
    }
  }
}

4.3 防窥保护参数配置说明

setAntiPeepMaskLayer接口支持丰富的配置参数:

参数名 类型 必填 说明
maskColor string 蒙层背景颜色,默认黑色
maskOpacity number 蒙层不透明度,范围0-1,默认0.85
showWarningTip boolean 是否显示警告提示,默认true
warningTipText string 警告提示文字内容
blurEffect boolean 是否启用背景模糊效果

4.4 防窥保护完整使用示例

// pages/StockDetailPage.ets
import { AntiPeepManager } from '../managers/AntiPeepManager';

@Entry
@Component
struct StockDetailPage {
  private antiPeepManager: AntiPeepManager = AntiPeepManager.getInstance();

  async aboutToAppear(): Promise<void> {
    // 1. 检测防窥保护是否可用
    const isAvailable = await this.antiPeepManager.isAntiPeepAvailable();
    
    if (isAvailable) {
      // 2. 注册防窥状态监听
      await this.antiPeepManager.subscribeAntiPeepState();
      console.info('AntiPeep protection activated');
    } else {
      console.info('AntiPeep not available, skipping protection setup');
    }
  }

  aboutToDisappear(): void {
    // 3. 页面销毁时取消订阅
    this.antiPeepManager.unsubscribeAntiPeepState();
    console.info('AntiPeep protection deactivated');
  }

  build() {
    Column() {
      // 股票详情内容
      StockDetailView()
    }
    .width('100%')
    .height('100%')
  }
}

提示:防窥保护的AI判断逻辑完全在设备本地运行,所有人脸数据均在端侧处理,不会上传云端,从根源杜绝数据泄露风险。这是HarmonyOS隐私安全设计理念的核心体现。


五、待机屏保卡片开发

5.1 待机屏保卡片概述

从API version 23开始,Form Kit提供了待机屏保卡片能力。当设备处于充电状态且横屏锁屏时,系统会进入待机屏保界面,并排展示两个2x2尺寸的卡片。

待机屏保卡片的核心价值:

  • 情感陪伴:在工作、学习时作为时钟摆台或信息看板
  • 效率提升:展示日程待办、行情概览等实用信息
  • 个性表达:支持自定义卡片样式,打造专属待机显示

5.2 待机屏保卡片约束

约束项 说明
尺寸限制 仅支持 2x2 尺寸
显示模式 默认为深色模式,不跟随系统
隐私规范 不推荐展示个人隐私敏感数据
设备要求 需存在"设置 > 桌面和个性化 > 待机屏保设置"选项
形态要求 横屏充电锁屏,与桌面夹角45°~90°稳定摆放

5.3 待机屏保卡片配置

form_config.json中,通过standby字段配置待机屏保属性:

{
  "forms": [
    {
      "name": "StockStandbyWidget",
      "displayName": "$string:standby_widget_name",
      "description": "$string:standby_widget_desc",
      "src": "./ets/widget/pages/StockStandbyCard.ets",
      "uiSyntax": "arkts",
      "isDynamic": true,
      "isDefault": true,
      "updateEnabled": true,
      "updateDuration": 1,
      "renderingMode": "autoColor",
      "defaultDimension": "2*2",
      "supportDimensions": [
        "2*2"
      ],
      "standby": {
        "isSupported": true,
        "isAdapted": true,
        "isPrivacySensitive": false
      }
    }
  ]
}

standby字段说明:

字段名 类型 说明
isSupported boolean 是否支持在待机屏保展示,true表示支持
isAdapted boolean 是否已适配待机屏保UX规范,true时系统会移除backgroundImage
isPrivacySensitive boolean 是否涉及隐私敏感信息,true时会有蒙版覆盖

5.4 待机屏保卡片UI实现

待机屏保卡片需要适配深色模式与横屏展示场景:

// ets/widget/pages/StockStandbyCard.ets

@Entry
@Component
struct StockStandbyCard {
  @State indexName: string = '上证指数';
  @State indexValue: string = '3342.67';
  @State indexChange: string = '+0.85%';
  @State topStocks: Array<{name: string, change: string}> = [
    { name: '茅台', change: '+2.1%' },
    { name: '宁德', change: '-0.8%' },
    { name: '比亚迪', change: '+1.5%' }
  ];

  build() {
    Column() {
      // 大盘指数区域
      Row() {
        Column() {
          Text(this.indexName)
            .fontSize(16)
            .fontColor('#E0E0E0')
            .fontWeight(FontWeight.Medium)
          
          Row() {
            Text(this.indexValue)
              .fontSize(32)
              .fontColor('#FFFFFF')
              .fontWeight(FontWeight.Bold)
            
            Text(this.indexChange)
              .fontSize(14)
              .fontColor('#FF6B6B')
              .margin({ left: 8 })
              .padding({ left: 6, right: 6, top: 2, bottom: 2 })
              .backgroundColor('rgba(255,107,107,0.2)')
              .borderRadius(4)
          }
          .margin({ top: 4 })
        }
        .alignItems(HorizontalAlign.Start)
        .layoutWeight(1)

        // 趋势指示图标
        Image($r('app.media.icon_trend_up'))
          .width(48)
          .height(48)
          .objectFit(ImageFit.Contain)
      }
      .width('100%')
      .height('50%')
      .alignItems(VerticalAlign.Center)

      // 热门个股列表
      Column() {
        Text('热门个股')
          .fontSize(12)
          .fontColor('#888888')
          .width('100%')
          .textAlign(TextAlign.Start)
          .margin({ bottom: 8 })

        ForEach(this.topStocks, (stock: {name: string, change: string}, index: number) => {
          Row() {
            Text(`${index + 1}. ${stock.name}`)
              .fontSize(14)
              .fontColor('#CCCCCC')
              .layoutWeight(1)
            
            Text(stock.change)
              .fontSize(14)
              .fontColor(stock.change.startsWith('+') ? '#FF6B6B' : '#4ECB71')
          }
          .width('100%')
          .margin({ bottom: 6 })
        })
      }
      .width('100%')
      .height('50%')
      .padding({ top: 8 })
      .border({ width: { top: 1 }, color: 'rgba(255,255,255,0.1)' })
    }
    .width('100%')
    .height('100%')
    .padding(16)
    .backgroundColor('#0D0D1A')
    .borderRadius(12)
  }
}

5.5 待机屏保开放能力申请

与锁屏卡片类似,待机屏保卡片也需要申请上架开放能力:

  1. 登录AppGallery Connect,选择目标应用
  2. 进入"开发与服务 > 开放能力管理"
  3. 点击待机屏保卡片对应的"申请"按钮
  4. 填写申请信息:
    • 申请原因:必填,包括应用介绍、使用场景、申请用途,不超过512个字符
    • 上传附件:选填,提供卡片UI设计释义材料
  5. 等待审核(1-3个工作日)
  6. 审核通过后勾选能力开关并保存

六、常见问题与排查方案

6.1 锁屏卡片无法成功添加

现象:用户在锁屏编辑界面找不到应用卡片,或添加后无内容显示。

排查清单

  1. 开放能力未申请:确认已在AppGallery Connect中申请并开通锁屏卡片能力
  2. 签名方式错误:锁屏卡片必须使用手动签名,自动签名无法调用系统开放能力
  3. 尺寸配置错误:确认supportDimensions中包含1*11*2
  4. renderingMode配置错误:检查API版本对应的配置方式是否正确
  5. 卡片未上架:部分能力要求应用处于已上架状态才能正常使用

6.2 防窥保护未触发

现象:在他人窥视时,系统未拉起隐私蒙层。

排查清单

  1. 功能未开启:检查设备"设置 > 隐私与安全 > 防窥保护"是否已开启
  2. 设备不支持:部分老旧设备缺少必要的传感器,需提前用isSupported()检测
  3. 未录入人脸:防窥保护依赖人脸解锁数据,需先完成人脸录入
  4. 订阅未注册:确认已正确调用dlpAntiPeep.on()注册状态监听
  5. 窗口ID错误:传入setAntiPeepMaskLayer的窗口ID必须为当前应用有效窗口

6.3 待机屏保卡片不显示

现象:设备进入待机屏保状态后,未显示应用卡片。

排查清单

  1. 开放能力未开通:确认已申请并通过待机屏保卡片能力审核
  2. 尺寸不匹配:待机屏保仅支持2x2尺寸,检查supportDimensions配置
  3. 设备不支持:部分设备无待机屏保设置选项,需在设置中确认
  4. 未正确添加卡片:用户需手动进入待机屏保编辑界面添加卡片
  5. isSupported配置错误:确认standby.isSupported设为true

七、隐私保护最佳实践

7.1 数据分级展示策略

建议根据场景的私密程度,对展示内容实施分级管理:

场景 展示内容建议 隐私处理
锁屏卡片 大盘指数、行业板块 隐藏个股持仓、资产总额
待机屏保 自选股名称与涨跌幅 不展示具体持仓数量与成本价
桌面浮窗 自选股列表、分时图 用户主动展开,视为授权查看
应用内 完整资产信息、交易记录 结合防窥保护,检测风险时蒙层遮盖

7.2 用户可控设计

  • 开关选项:在应用设置中提供"锁屏显示行情"开关,尊重用户选择权
  • 敏感信息脱敏:对金额、持仓等敏感数据实施部分隐藏(如显示为****
  • 自动隐藏机制:锁屏卡片在无人操作一段时间后自动停止刷新,降低信息暴露窗口

总结

本文系统梳理了HarmonyOS全链路盯盘中的隐私保护方案,涵盖锁屏卡片配置、防窥保护集成、待机屏保适配三大核心模块。让我们回顾关键知识点:

  1. 锁屏卡片:通过Form Kit实现1x1/1x2尺寸卡片,需配置renderingModesupportDimensions,并申请上架开放能力
  2. 防窥保护:利用Device Security Kit的dlpAntiPeep模块,订阅peepStateChange事件,动态拉起/隐藏隐私蒙层
  3. 待机屏保:配置2x2尺寸卡片与standby字段,适配深色模式与横屏展示场景
  4. 开放能力申请:锁屏卡片与待机屏保均需在AppGallery Connect中手动申请,使用手动签名
  5. 隐私分级:根据场景敏感度实施差异化的信息展示策略,将用户隐私保护贯穿于全链路盯盘的每个环节

HarmonyOS的隐私保护设计哲学告诉我们:真正的用户体验升级,不是功能的无限叠加,而是在提供便捷服务的同时,让用户感受到安全与尊重。将防窥保护与锁屏卡片深度融合,正是这一理念在金融场景中的最佳实践。


如果觉得本文对你有帮助,欢迎点赞、收藏、转发!你的支持是我持续创作的动力。

相关资源推荐:

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐