WebUSB API 可将非标准的通用串行总线 (USB) 兼容设备公开给 Web。本页介绍了扩展程序特有的 API 方面。如需了解 WebUSB API 的完整详细信息,请参阅 MDN。
扩展服务中的可用性
Chrome 118 或更高版本。
权限
无需任何清单文件权限;不过,WebUSB 会触发浏览器的用户权限流程。
清单
此 API 不需要任何清单键。
支持的上下文
此 API 可在几乎任何上下文中使用;WebUSB.requestDevice() 方法不能在扩展程序服务工作线程中使用。有关详情,请参见下文。
在扩展程序 Service Worker 中使用此 API 时,设备连接会话会使 Service Worker 保持活跃状态。
Chrome 扩展程序差异
虽然扩展程序 Service Worker 可以使用 WebUSB,但 WebUSB.requestDevice()(返回一个 Promise,该 Promise 会解析为 USBDevice 实例)无法在扩展程序 Service Worker 中调用。为了解决此问题,请从扩展程序 Service Worker 以外的扩展程序页面调用 requestDevice(),并向扩展程序 Service Worker 发送消息。
以下代码遵循了典型模式,在需要用户手势的权限流程中调用了 requestDevice()。当设备被获取时,它会向 Service Worker 发送一条消息,然后 Service Worker 可以使用 getDevices() 检索设备。
popup.js:
myButton.addEventListener("click", async () => {
await navigator.usb.requestDevice({
filters: [{ vendorId: 0x1234, productId: 0x5678 }],
});
chrome.runtime.sendMessage("newDevice");
});
service-worker.js
chrome.runtime.onMessage.addListener(async (message) => {
if (message === "newDevice") {
const devices = await navigator.usb.getDevices();
for (const device of devices) {
// open device connection.
await device.open();
}
}
});