迁到 WebUSB
如果暂时不能替换 @ukeyfe/hardware-web-sdk 包名,但想先把底层连接从 Bridge 改成 WebUSB,可以采用这条过渡路线:保留 SDK 入口,只调整初始化环境和授权方式。
前提
- 请使用基于 Chromium 的桌面浏览器,例如 Chrome 或 Edge。
- Node.js 建议 18 及以上,最好直接使用 LTS 版本。
改动点
- 初始化环境从 Bridge 的
env: 'web'改为 WebUSB 的env: 'webusb'。 hardware-web-sdk仍需要connectSrc,请保持为当前可用的 iframe 主机版本,例如https://jssdk.demo.example/1.1.16/。- USB 设备授权改为
navigator.usb.requestDevice(),并使用官方 UKey Wallet 过滤器。 - 设备选择器必须由用户手势触发;在授权前不要自动发现设备。
- Bridge 检查逻辑(如
checkBridgeStatus())不再适用于 WebUSB。 - 链 API 的调用方式通常不需要改动。
初始化接入(hardware-web-sdk + WebUSB)
import HardwareWebSdk from "@ukeyfe/hardware-web-sdk";
// 继续沿用 hardware-web-sdk 的默认导出方式。
const ukeySdk = HardwareWebSdk.HardwareWebSdk;
await ukeySdk.init({
env: "webusb",
// hardware-web-sdk 依旧需要配置 iframe 宿主。
connectSrc: "https://jssdk.demo.example/1.1.16/",
debug: true,
fetchConfig: true,
});
申请USB权限
import { UKEY_WEBUSB_FILTER } from "@ukeyfe/hardware-shared";
// 从用户可见的操作触发;拿到权限后再继续扫描设备。
// 授权之前,浏览器不会把 USB 设备暴露给页面。
await navigator.usb.requestDevice({ filters: UKEY_WEBUSB_FILTER });
扫描并调用
// 1) 扫描设备
const deviceList = await ukeySdk.searchDevices();
if (!deviceList.success) throw new Error(deviceList.payload.error);
const { connectId, deviceId } = deviceList.payload[0] ?? {};
// 2) (按需执行)再拉取设备特征信息,用返回的钱包标识兜底
const featureInfo = await ukeySdk.getFeatures(connectId);
if (!featureInfo.success) throw new Error(featureInfo.payload.error);
const resolvedDeviceId = featureInfo.payload.device_id ?? deviceId;
// 3) 参考写法:读取 BTC 地址
const addressResult = await ukeySdk.btcGetAddress(connectId, resolvedDeviceId, {
path: "m/84'/0'/2'/0/0",
coin: "btc",
showOnUKey: false,
});
if (addressResult.success) {
console.log("解析出的 BTC 地址:", addressResult.payload.address);
} else {
console.error("调用失败:", addressResult.payload.error, addressResult.payload.code);
}
收尾清单
- 移除 Bridge 专属检查和提示,例如
checkBridgeStatus()。 connectSrc仍然需要保留,并指向最新 iframe 主机。- 在页面中检测
navigator.usb,不支持时给出浏览器兼容提示。 - 链 API、PIN、Passphrase 等上层流程保持原有处理方式。