WebUSB API 浏览器支持
发布于
WebUSB API — WebUSB API 允许网页应用通过 navigator.usb.requestDevice() 请求访问非标准 USB 设备,并直接与其通信。
浏览器与生态支持
Section titled “浏览器与生态支持”- 图例
- 支持
- 部分支持
- 需开启标志
- 不支持
- 未知
| 浏览器 / 平台 | 支持 | 版本 | 置信度 | 来源 | 备注 |
|---|---|---|---|---|---|
| Chrome (Desktop) | 支持 | 61 | 高 | 来源 | — |
| Chrome (Android) | 支持 | 61 | 高 | 来源 | 1 |
| Edge (Desktop) | 支持 | 79 | 高 | 来源 | 2 |
| Firefox (Desktop) | 不支持 | — | 高 | 来源 | 3 |
| Firefox (Android) | 不支持 | — | 高 | 来源 | 45 |
| Safari (macOS) | 不支持 | — | 高 | 来源 | 6 |
| Safari (iOS) | 不支持 | — | 高 | 来源 | 78 |
| Samsung Internet | 支持 | 8.0 | 高 | 来源 | 9 |
| WebView (Android) | 不支持 | — | 高 | 来源 | 10 |
| Opera | 支持 | 48 | 高 | 来源 | — |
- 由 browser-compat-data 镜像自 Chrome 的数据推导。
- 由 browser-compat-data 镜像自 Chrome 的数据推导。
- browser-compat-data 未记录 Firefox 的支持。
- browser-compat-data 未记录 Firefox for Android 的支持。
- 由 browser-compat-data 镜像自 Firefox 的数据推导。
- browser-compat-data 未记录 Safari 的支持。
- browser-compat-data 未记录 iOS 版 Safari 的支持。
- 由 browser-compat-data 镜像自 Safari 的数据推导。
- 由 browser-compat-data 镜像自 Chrome Android 的数据推导。
- browser-compat-data 未记录 WebView Android 的支持。
请求设备必须在用户手势内进行,filters 可将选择器限定为匹配指定 vendorId/productId
组合的设备。用户选择设备后,需要先打开设备,然后才能传输数据:
async function connectUsbDevice() { const device = await navigator.usb.requestDevice({ filters: [{ vendorId: 0x1209, productId: 0xa800 }], }); await device.open(); return device;}接下来要选择的配置和要声明的接口编号因设备而异,取决于该设备自身的描述符——应从
device.configurations 中读取具体值,再用读到的值调用 device.selectConfiguration()
和 device.claimInterface(),而不要假定固定的编号。
如何在运行时检测
Section titled “如何在运行时检测”在提供该功能之前先检测 navigator.usb 是否存在,并为不支持的情况提供回退:
if ('usb' in navigator) { connectButton.hidden = false;} else { connectButton.hidden = true; fallbackNotice.textContent = '此浏览器无法在页面中访问 USB 设备。';}- 需要安全上下文(HTTPS)——在普通 HTTP 源上不可用。
requestDevice()需要短暂的用户激活(点击或按键处理函数);缺少时返回的 Promise 会以SecurityErrorDOMException拒绝。claimInterface()声明某个接口以供独占使用:同一时间只有一个执行上下文可以持有某个接口, 必须先调用releaseInterface()(或关闭设备)释放它,其他上下文才能声明该接口。- 设备选择器只会列出匹配传入
filters的设备,如果没有匹配设备,用户将无从选择, 导致返回的 Promise 被拒绝。 - Firefox 和 Safari 未实现该 API,因此在这些浏览器中
'usb' in navigator为false, 依赖 USB 的流程需要使用上面的回退路径。
完整参考(设备配对、权限模型、着陆页)见 WebUSB API。
另见通过蓝牙实现相同流程的 Web Bluetooth API。
← 返回兼容性浏览器。