在这里插入图片描述

一、项目背景与核心诉求

零售门店自助收银设备属于企业专用单应用终端,核心痛点:顾客只能操作收银业务,无法切系统、退出应用、打开设置、安装第三方软件,同时满足7×24小时稳定运行、后台对账/打印/本地AI技能常驻、政企安全合规。

核心业务约束

  1. 设备开机直接进入收银App,锁定Kiosk单一应用,屏蔽多任务、返回、桌面、下拉控制中心;
  2. 仅管理员凭密码可退出锁机模式,普通顾客无任何退出入口;
  3. 后台Agent、分布式同步、日志导出、打印服务独立进程保活,前台收银页面切换不中断;
  4. 折叠平板收银机自动适配合拢/展开/悬停三形态,分屏、悬浮窗强制禁用;
  5. 全链路操作审计日志、本地敏感数据HUKS加密、A2A跨应用技能白名单管控,满足零售数据合规;
  6. 支持HEM企业MDM远程下发锁机/解锁、批量更新策略、远程重置设备。

鸿蒙7 Kiosk 核心能力定位

@kit.AbilityKit/kioskManager 企业级单一应用锁定模式,属于系统级商用管控能力,仅企业MDM授权应用可调用,彻底隔离系统入口,区别于普通应用简易锁屏。

二、整体落地全流程(分5大阶段)

阶段1:企业资质与MDM前置授权(上线必经)

1.1 资质开通(AGC企业账号)
  1. 注册华为企业开发者账号,完成企业资质认证;
  2. 申请企业系统权限 ohos.permission.ENTERPRISE_SET_KIOSK,用于MDM应用配置Kiosk白名单;
  3. 开通HEM企业设备管理平台,录入门店收银设备SN序列号,绑定管控策略。
1.2 设备OOBE出厂部署流程
  1. 设备开机进入出厂配置界面,连接企业WiFi;
  2. 自动安装HEM设备管理MDM应用,激活设备管理员权限;
  3. MDM调用 setAllowedKioskApps 将收银业务App包名加入系统Kiosk白名单;
  4. 配置系统全局限制策略:禁用分屏、悬浮窗、下拉通知栏、应用安装卸载、设置入口、USB文件传输。

关键约束:业务App无法自行开启Kiosk白名单,必须由MDM设备管理应用预先配置,否则调用enterKioskMode直接报错权限拒绝。

1.3 module.json5 全局能力配置
"abilities": [
  {
    "name": "EntryUIAbility",
    "window": {
      "supportFoldable": true,
      "supportWindowMode": ["fullScreen"], // Kiosk仅允许全屏,禁用split/freeform
      "autoHiddenNavigationBar": true, // 隐藏导航条,杜绝返回退出
      "autoHiddenStatusBar": true
    }
  }
],
"requestPermissions": [
  { "name": "ohos.permission.INTERACT_WITH_AGENT" },
  { "name": "ohos.permission.USE_SHARED_MEMORY" },
  { "name": "ohos.permission.USE_HUKS" }
]

阶段2:Kiosk 锁机核心API开发(业务收银App)

2.1 基础状态工具封装 KioskUtil.ets
import { kioskManager, common } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';

const TAG = "StoreKioskUtil";
// 管理员退出密码,生产存入HUKS硬件加密存储
const ADMIN_PWD = "STORE_ADMIN_2026";

export class KioskUtil {
  private ctx: common.UIAbilityContext;
  private static instance: KioskUtil;

  static getInstance(ctx: common.UIAbilityContext) {
    if (!KioskUtil.instance) KioskUtil.instance = new KioskUtil(ctx);
    return KioskUtil.instance;
  }

  constructor(context: common.UIAbilityContext) {
    this.ctx = context;
  }

  // 进入商用Kiosk锁定模式
  async enterLock() {
    try {
      await kioskManager.enterKioskMode(this.ctx);
      hilog.info(TAG, "Kiosk商用锁定模式开启成功");
      return true;
    } catch (e) {
      const err = e as BusinessError;
      hilog.error(TAG, `进入Kiosk失败: ${err.code} ${err.message}`);
      return false;
    }
  }

  // 校验管理员密码后退出Kiosk
  async exitLock(inputPwd: string): Promise<boolean> {
    if (inputPwd !== ADMIN_PWD) return false;
    try {
      await kioskManager.exitKioskMode(this.ctx);
      hilog.info(TAG, "管理员验证通过,退出Kiosk锁机");
      return true;
    } catch (e) {
      hilog.error(TAG, "退出Kiosk失败");
      return false;
    }
  }

  // 获取当前锁机状态
  async getStatus() {
    return kioskManager.getKioskStatus();
  }
}
2.2 EntryUIAbility 开机自动进入锁机
import { UIAbility, window } from '@kit.AbilityKit';
import { KioskUtil } from '../utils/KioskUtil';
import { WindowUniformUtil } from '../utils/WindowUtil';

export default class EntryUIAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage): void {
    // 1. 初始化全局窗口/折叠统一监听
    const winUtil = WindowUniformUtil.getInstance();
    winUtil.init(windowStage, this.context);
    // 2. 开机自动进入Kiosk商用锁定
    const kiosk = KioskUtil.getInstance(this.context);
    kiosk.enterLock();
    // 3. 启动后台Agent智能体服务(对账、打印、本地加密)
    this.startAgentService();
    windowStage.loadContent("pages/CashierIndex");
  }

  startAgentService() {
    // 启动AgentExtensionAbility后台技能服务,7×24保活
  }

  onDestroy(): void {
    WindowUniformUtil.getInstance().destroy();
  }
}

阶段3:收银页面安全交互层(隐藏管理员退出入口)

在这里插入图片描述

普通顾客无任何退出按钮,采用隐蔽区域连续点击5次弹出密码弹窗,防止顾客误操作、恶意退出:

import { ComponentV2, Local, promptAction, TextInput } from '@kit.ArkUI';
import { KioskUtil } from '../utils/KioskUtil';

@Entry
@ComponentV2
struct CashierIndex {
  @Local showPwdDialog: boolean = false;
  @Local inputPwd: string = "";
  private clickCount = 0;
  private lastClickTs = 0;
  private kioskUtil = KioskUtil.getInstance(getContext(this));

  // 底部logo隐蔽点击区域(管理员入口)
  adminClickArea() {
    const now = Date.now();
    // 3秒内连续点击5次触发弹窗
    if (now - this.lastClickTs < 3000) {
      this.clickCount++;
    } else {
      this.clickCount = 1;
    }
    this.lastClickTs = now;
    if (this.clickCount >= 5) {
      this.showPwdDialog = true;
      this.clickCount = 0;
    }
  }

  async confirmExit() {
    const ok = await this.kioskUtil.exitLock(this.inputPwd);
    if (ok) {
      this.showPwdDialog = false;
      promptAction.showToast("已退出商用锁定模式");
    } else {
      promptAction.showToast("管理员密码错误");
    }
  }

  build() {
    Column() {
      // 收银主业务界面:商品扫码、结算、支付、小票打印
      Text("自助收银系统").fontSize(30);

      // 隐蔽管理员入口:底部品牌Logo区域
      Text("门店收银系统 V2.0")
        .fontSize(12)
        .margin({ top: 60 })
        .onClick(() => this.adminClickArea())

      // 管理员密码弹窗
      if (this.showPwdDialog) {
        Column() {
          Text("管理员解锁退出").fontSize(20);
          TextInput({ text: this.inputPwd })
            .type(InputType.Password)
            .onChange(v => this.inputPwd = v);
          Row() {
            Button("取消").onClick(() => this.showPwdDialog = false);
            Button("确认退出").onClick(() => this.confirmExit());
          }
        }
        .width("90%")
        .padding(20)
        .backgroundColor("#fff")
        .borderRadius(12)
        .position({ x: "5%", y: "30%" })
      }
    }
    .width("100%")
    .height("100%")
  }
}

阶段4:多配套能力融合适配(收银机全场景刚需)

4.1 折叠屏全域自适应(折叠收银平板)

依托全局WindowUniformUtil窗口状态,一套逻辑覆盖合拢/展开/悬停:

  1. 合拢窄屏:GridRow单列布局,简化收银卡片;
  2. 展开大屏:双列栅格,商品列表+结算面板左右分栏;
  3. 悬停模式:FoldSplitContainer上下分区,上屏扫码展示、下屏操作按键;
    Kiosk锁定模式下自动屏蔽分屏、悬浮窗,仅保留全屏业务布局。
4.2 AgentExtensionAbility 后台技能长驻(对账/打印/加密)

独立后台进程,Kiosk锁机不受前台页面生命周期影响:

  1. 本地离线报表生成、百MB日志流式导出(搭配CoreFileKit+SharedMemory零拷贝);
  2. A2A跨应用技能白名单管控,仅允许门店配套库存应用读取低风险数据;
  3. 高风险操作(管理员密码解密、批量台账删除)第三方应用拦截。
4.3 SecurityKit 数据安全闭环
  1. 收银台账、会员信息、支付凭证使用HUKS SM4硬件加密存储;
  2. 管理员退出密码存入TEE安全区,禁止明文硬编码;
  3. A2A跨应用通信报文SM3哈希校验,防止篡改。
4.4 DistributedMultiKit 多门店设备同步

门店多台收银机实时同步商品库、活动配置,Kiosk后台Agent持续同步,前台收银不阻塞。

4.5 ShareKit 碰一碰素材交互

顾客手机碰收银表单附件区域,身份证/商品图片直接填充录入,传输文件国密分片加密。

阶段5:MDM远程管控与运维体系(批量门店落地)

5.1 HEM平台远程能力
  1. 远程一键锁定/解锁Kiosk模式,无需管理员到店输入密码;
  2. 批量下发白名单、禁用应用、网络访问策略;
  3. 远程静默升级收银App、Agent后台服务;
  4. 远程导出全链路安全审计日志(锁机启停、管理员退出、A2A技能调用、加密操作);
  5. 定时开关机、低电量远程锁定、丢失设备强制恢复出厂。
5.2 全局系统限制策略(MDM统一配置)

通过MDM restrictions 接口禁用以下风险入口,杜绝绕过Kiosk:

  1. 禁止下拉控制中心、通知栏快捷操作;
  2. 禁止分屏、智慧多窗、悬浮自由窗;
  3. 禁止进入系统设置、应用市场、浏览器;
  4. 禁止USB安装应用、文件拷贝、ADB调试;
  5. 禁止修改WiFi、网络、锁屏密码、设备名称。

三、鸿蒙6简易锁屏 VS 鸿蒙7企业Kiosk商用锁机 核心差异

对比维度 鸿蒙6简易LockTask锁屏(消费级) 鸿蒙7 @kit.AbilityKit Kiosk企业锁定(商用)
授权机制 应用本地弹窗授权,无企业管控 MDM设备管理平台系统级授权,AGC企业资质审核
绕过风险 可通过多任务、下拉通知、USB、ADB退出 MDM全局策略屏蔽所有系统入口,无法绕过
后台保活 页面销毁后台同步中断 AgentExtensionAbility独立进程7×24小时常驻
跨应用管控 无A2A鉴权,第三方可随意读取数据 技能白名单+分级风险拦截,政企合规
远程运维 无远程锁机/解锁能力 HEM平台批量远程管控、静默升级
折叠/分屏兼容 分屏、悬浮窗仍可唤起其他应用 强制禁用多窗口,仅允许全屏业务布局
安全审计 无统一操作日志 锁机、退出、技能调用全链路安全埋点
适用场景 展厅临时演示、单设备短期使用 零售收银、政务自助、ATM、工业专用终端长期商用

四、落地高频踩坑复盘(项目真实问题)

坑1:调用enterKioskMode报权限拒绝801

  1. 未通过HEM MDM应用执行setAllowedKioskApps添加收银App白名单;
  2. 未申请企业系统权限ohos.permission.ENTERPRISE_SET_KIOSK
  3. 使用普通个人签名,商用Kiosk仅支持企业MDM正式签名。
    修复流程:企业资质认证 → MDM应用部署 → OOBE设备激活配置白名单。

坑2:顾客可下拉通知栏、切多任务绕过锁机

根因:窗口配置未隐藏状态栏/导航栏,MDM未下发禁用多窗口策略;
修复

  1. module.json5开启autoHiddenStatusBar/autoHiddenNavigationBar
  2. MDM restrictions全局禁用智慧多窗、分屏、通知栏快捷入口。

坑3:前台页面切后台,对账Agent同步中断

鸿蒙6简易锁屏页面销毁后台终止;
标准方案:业务逻辑剥离至AgentExtensionAbility独立后台进程,不受UI页面生命周期影响,Kiosk模式下系统优先保活扩展能力。

坑4:折叠悬停+Kiosk叠加布局错乱

窗口状态判断优先级:悬停HOVER > 全屏Kiosk;
全局窗口状态统一读取,悬停强制启用FoldSplitContainer,屏蔽多窗口分支逻辑。

坑5:管理员密码明文存储存在泄露风险

整改:密码通过SecurityKit HUKS存入TEE硬件安全区,启动时从共享内存读取,不持久化明文到本地文件。

坑6:百MB日志导出卡顿、OOM闪退

旧版FileIO全量拷贝内存占用高;
优化CoreFileKit流式分片读写 + SharedMemoryKit零拷贝IPC,降低内存峰值70%以上。

坑7:模拟器无法复现完整Kiosk锁机能力

模拟器裁剪企业MDM、Kiosk底层驱动,必须商用平板/折叠真机配合HEM设备验证全流程。

五、门店收银Kiosk生产级落地规范(标准化沉淀)

  1. 部署标准化
    设备出厂OOBE绑定HEM企业管理平台,MDM预先配置Kiosk白名单与全局限制策略,开机自动进入收银锁机模式。
  2. 退出安全规范
    不对外暴露退出按钮,采用隐蔽区域多点触发密码弹窗;管理员密码由HUKS硬件托管,禁止硬编码明文。
  3. 前后台解耦强制规范
    对账、打印、日志导出、分布式同步、A2A智能体全部剥离至AgentExtensionAbility独立后台,前台仅负责收银交互UI。
  4. 多窗口严格管控
    Kiosk模式下全局禁用分屏、悬浮窗、自由窗口,窗口布局仅保留全屏/折叠悬停两套分支。
  5. 安全全链路埋点
    Kiosk进入/退出、管理员密码验证、A2A跨应用技能调用、文件加密、日志导出全部打印安全审计日志,可追溯操作人、设备SN、时间。
  6. 性能压测标准
    7×24小时连续运行无内存泄漏、无ANR;120MB日志导出峰值内存不超过70MB;折叠开合、窗口拖拽无掉帧。
  7. 离线无网络闭环
    收银、加密、Agent技能、Kiosk锁机全部端侧本地运行,断网不影响基础收银业务,联网后同步台账至云端。

六、项目落地总结

鸿蒙7企业级Kiosk商用锁定模式依托@kit.AbilityKit标准化锁机API + HEM企业MDM远程管控体系,解决零售自助收银机随意退出、系统入口绕过、后台服务中断、多窗口布局错乱、数据安全不合规、批量运维成本高六大商用痛点。
整套方案可与折叠栅格、FoldSplitContainer、Agent跨应用A2A通信、SecurityKit星盾安全、CoreFileKit流式文件、SharedMemory零拷贝IPC全链路原生联动,形成「设备管控→锁定隔离→前台收银→后台技能→数据加密→远程运维」完整商用终端闭环,是零售门店、政务大厅、工业专用自助设备的标准化长期落地方案。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐