跳到主要内容

PIN说明

PIN 是大多数受保护操作都会遇到的用户验证步骤。SDK 不会自行弹出固定 UI,而是通过事件告诉应用“现在需要 PIN”,再由应用决定展示设备端输入或软件端盲输。

核心提示

  • 当设备处于锁定状态,且当前请求需要授权时,会触发 UI_REQUEST.REQUEST_PIN
  • UKey Core 26 必须在设备上填写 PIN,不能走软件端盲输。
  • 支持软件端 PIN 的型号也建议优先使用设备端输入,让 PIN 不进入宿主应用。

支持表(软件 PIN)

下表用于判断是否可以展示“在此屏幕输入”的选项。即使型号支持软件端 PIN,也建议把“改在设备上输入”作为默认路径。

设备系列软件侧 PIN 输入仅设备端输入
UKey Lite 24 / Lite 25支持
UKey Core 26不支持

UI 建议

  • 展示一个聚焦的 PIN 对话框,不要同时弹出多层提示。
  • 默认动作使用“改在设备上输入”;只有支持软件端 PIN 的型号才展示“在此屏幕输入”。
  • 软件端 PIN 使用固定 3x3 键盘,界面只显示掩码,不回显真实数字。
  • 收到关闭事件或受保护流程结束后,及时关闭 PIN 对话框。

PIN 映射表(软件键盘)

软件端九宫格布局:

7 8 9
4 5 6
1 2 3

软件键盘展示的是位置,发送给 SDK 的是映射后的值。下面的数组把界面上的 1..9 转换为设备需要的顺序:

const PIN_KEYPAD_MAP = ["7", "8", "9", "4", "5", "6", "1", "2", "3"];
let mappedPin = "";

function appendMappedPinDigit(slot: number) {
// slot 表示用户点到的九宫格位置编号
mappedPin += PIN_KEYPAD_MAP[slot - 1];
}

例如用户点击软件键 19,映射后得到 73,最终发送 73

处理 PIN 事件

import { UI_EVENT, UI_REQUEST, UI_RESPONSE } from "@ukeyfe/hardware-core";

ukeySdk.on(UI_EVENT, (uiEvent) => {
if (uiEvent.type === UI_REQUEST.REQUEST_PIN) {
// 更建议:把 PIN 放到设备上完成输入。
ukeySdk.uiResponse({
type: UI_RESPONSE.RECEIVE_PIN,
payload: "@@UKEY_INPUT_PIN_IN_DEVICE",
});

// 备用方式:仅在支持软件端 PIN 的机型上使用。
const mappedPin = "73"; // 根据键盘位置换算
ukeySdk.uiResponse({ type: UI_RESPONSE.RECEIVE_PIN, payload: mappedPin });
}
});