Generic Sensor API 浏览器支持
发布于
Generic Sensor API —— 根据 MDN,Sensor APIs 是“一组按统一设计构建的接口,以一致的
方式把设备传感器暴露给 Web 平台”。开发者使用 Accelerometer、Gyroscope、
Magnetometer、AmbientLightSensor 等具体子类,而不是直接使用基类 Sensor。
浏览器与生态支持
Section titled “浏览器与生态支持”各传感器接口的支持情况并不相同,下表以 Accelerometer 作为代表性实现:
- 图例
- 支持
- 部分支持
- 需开启标志
- 不支持
- 未知
| 浏览器 / 平台 | 支持 | 版本 | 置信度 | 来源 | 备注 |
|---|---|---|---|---|---|
| Chrome (Desktop) | 支持 | 67 | 高 | 来源 | — |
| Chrome (Android) | 支持 | 67 | 高 | 来源 | 1 |
| Edge (Desktop) | 支持 | 79 | 高 | 来源 | 2 |
| Firefox (Desktop) | 不支持 | — | 高 | 来源 | 3 |
| Firefox (Android) | 不支持 | — | 高 | 来源 | 45 |
| Safari (macOS) | 不支持 | — | 高 | 来源 | 6 |
| Safari (iOS) | 不支持 | — | 高 | 来源 | 78 |
| Samsung Internet | 支持 | 9.0 | 高 | 来源 | 9 |
| WebView (Android) | 支持 | 67 | 高 | 来源 | 10 |
- 由 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 镜像自 Chrome Android 的数据推导。
根据 MDN browser-compat-data,Gyroscope 与 Accelerometer 一致;而 Magnetometer 与
AmbientLightSensor 在 Chromium 中只有开启
#enable-experimental-web-platform-features 标志后才可用——请对实际使用的接口做特性
检测,不要用一个笼统的结论代替。
构造传感器时可传入可选的 frequency,随后启动;读数通过 reading 事件送达:
const acl = new Accelerometer({ frequency: 60 });acl.addEventListener('reading', () => { console.log(`Acceleration along the X-axis ${acl.x}`);});acl.start();根据 MDN,使用传感器还需要用户通过 Permissions API 授权(权限名称因传感器而异,
例如 'accelerometer'、'magnetometer'、'ambient-light-sensor'),并且该功能
“仅在安全上下文(HTTPS)中可用”。
如何在运行时检测
Section titled “如何在运行时检测”先检测 window 上是否存在具体接口,缺失时返回明确的回退结果,而不是让构造函数抛错:
function startAccelerometer(onReading) { if (!('Accelerometer' in window)) { // 回退:此处未暴露该接口,因此没有依赖运动的界面—— // 调用方保持静态布局。 return null; } try { const sensor = new Accelerometer({ frequency: 60 }); sensor.addEventListener('error', (event) => { console.error(`Sensor error: ${event.error.name}`); }); sensor.addEventListener('reading', () => onReading(sensor)); sensor.start(); return sensor; } catch (error) { // 根据 MDN,当服务端设置的 Permissions Policy 阻止该功能时, // Accelerometer() 构造函数会抛出 SecurityError。 console.error(`Could not start sensor: ${error.name}`); return null; }}- 根据 MDN,
Accelerometer接口“仅在安全上下文(HTTPS)中可用”。 - 对具体接口做特性检测(
'Accelerometer' in window等)——根据 MDN browser-compat-data,Accelerometer/Gyroscope与Magnetometer/AmbientLightSensor在 Chromium 中的标志要求并不相同。 - 处理传感器的
error事件——根据 MDN,事件触发后传感器会“进入空闲并停止读取数值”, 直到重新启动。 - 构造函数抛出
SecurityError意味着 Permissions Policy 正在阻止该功能, 这是 MDN 为Accelerometer()记录的异常。 - 根据 MDN browser-compat-data,Firefox 与 Safari 均未实现这些接口, 因此请设计真正可用的回退路径,而不是留下一个无效功能。
完整参考(权限名称、错误处理、各传感器差异)见 Generic Sensor API。
另见 Geolocation——本浏览器中的另一项设备能力条目。
← 返回兼容性浏览器。