iOS 上无法使用 Web Bluetooth API——navigator.bluetooth 始终为 undefined,因 WebKit 硬性禁用该 API,官方称隐私与安全模型不兼容;替代方案只能通过原生桥接(Swift + WKWebView)实现。

iOS 上无法通过 HTML5 的 Web Bluetooth API 直接连接蓝牙设备——该 API 在所有 iOS 版 Safari 及基于 WebKit 的 WebView 中被完全禁用,且 Apple 未提供任何配置开关或开发者选项来启用它。
为什么 navigator.bluetooth 在 iOS 上始终为 undefined
这是 WebKit 的硬性限制,不是 Bug 或版本问题。自该 API 在 Chrome 56 引入以来,Apple 从未在 iOS 的 WebKit 中实现它,官方理由是“隐私与安全模型不兼容”。即使你使用 https、用户主动触发(如 button click)、现代 iOS 17+,navigator.bluetooth 依然不存在。
- 检查方式:
console.log('bluetooth' in navigator)→ 永远返回false - iOS 所有浏览器(Safari、Chrome、Edge)底层都用 WebKit,因此全部失效
- 不支持
requestDevice()、getDevices()等任何相关方法
替代方案:必须走原生桥接(iOS App + WKWebView)
若你控制着 iOS 应用端,唯一可行路径是:用 Swift 实现 CoreBluetooth 扫描/连接,再通过 WKScriptMessageHandler 向网页暴露定制 JS 接口。网页调用类似 window.iosBluetooth.scan(),实际由原生层执行并回调结果。
- 网页不能直接访问蓝牙硬件,但可以发指令给宿主 App
- 需在
Info.plist中添加NSBluetoothAlwaysUsageDescription描述权限用途 - 原生侧需处理
CBPeripheral连接、GATT 读写,并将数据序列化后 post 到 JS 上下文 - 注意:无法在 PWA 或纯网页中绕过此限制
常见误判场景与验证建议
很多开发者误以为是 HTTPS 不足、用户手势缺失或 iOS 版本太低,其实只要在 iOS 上跑,就注定失败。验证前请先确认运行环境:
立即学习“前端免费学习笔记(深入)”;
- 用
console.log(navigator.userAgent)确认是否为iPad OS或iPhone OS - 不要依赖
caniuse.com的“部分支持”标注——它指桌面 Safari,不涵盖 iOS - 避免在 iOS 模拟器上测试蓝牙逻辑:模拟器本身不支持 CoreBluetooth,真机也无 Web API
- 若看到
SecurityError: Bluetooth API not supported或类似报错,基本可断定是 iOS 环境
真正卡点不在 JS 写法,而在架构设计:你得接受“网页只是控制面板,蓝牙是原生的事”这个前提。跳过桥接想纯前端连 BLE 设备,在当前 iOS 生态里没有例外路径。










