You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CoreBluetooth(macOS Swift)无法发现蓝牙鼠标和键盘

解决CoreBluetooth无法发现苹果键盘/鼠标的问题

你碰到的这个问题其实挺常见的——CoreBluetooth是专门针对蓝牙低功耗(BLE)设备设计的,而苹果的键盘、鼠标属于经典蓝牙(BR/EDR)HID设备,所以用CoreBluetooth默认扫描是找不到它们的。下面给你详细解释原因和解决方案:

为什么扫不到?

苹果键鼠这类HID设备使用的是经典蓝牙协议,而非BLE。CoreBluetooth框架的核心能力就是处理BLE设备的扫描、连接和数据交互,它并不支持经典蓝牙设备的发现流程。你能扫到iPhone和电视,是因为这些设备同时支持BLE(比如iPhone的AirDrop、电视的BLE配对功能),所以会被CoreBluetooth捕捉到。

正确的解决方案:使用IOBluetooth框架(macOS专属)

要发现经典蓝牙设备,你需要用macOS专门提供的IOBluetooth框架,它支持经典蓝牙的扫描、配对和连接操作。下面是一个简单的示例代码:

  1. 首先导入框架:
import IOBluetooth
  1. 设置扫描代理并启动扫描:
class ViewController: NSViewController, IOBluetoothDeviceInquiryDelegate {
    var inquiry: IOBluetoothDeviceInquiry?

    override func viewDidLoad() {
        super.viewDidLoad()
        setupBluetoothInquiry()
    }

    func setupBluetoothInquiry() {
        inquiry = IOBluetoothDeviceInquiry(delegate: self)
        // 设置扫描范围为所有经典蓝牙设备
        inquiry?.setSearchCriteria(nil)
        // 开始扫描
        inquiry?.start()
    }

    // 发现设备的回调
    func deviceInquiry(_ sender: IOBluetoothDeviceInquiry, didDiscover device: IOBluetoothDevice!) {
        print("发现经典蓝牙设备:\(device.name ?? "未知设备"),地址:\(device.addressString())")
        // 如果是键盘/鼠标,可以通过device.services来判断是否包含HID服务
        if device.services.contains(kIOBluetoothHIDServiceClassID) {
            print("这是一个HID设备(键盘/鼠标)")
        }
    }

    // 扫描结束的回调
    func deviceInquiryComplete(_ sender: IOBluetoothDeviceInquiry!, error: IOReturn, aborted: Bool) {
        if aborted {
            print("扫描被终止")
        } else {
            print("扫描完成")
        }
    }
}

额外说明

  • 如果你需要同时扫描BLE设备和经典蓝牙设备,可以同时使用CoreBluetooth和IOBluetooth两个框架,各自处理对应的设备类型。
  • 你之前尝试的scanForPeripherals(withServices: nil)即使传nil,也只会扫描BLE设备,因为CoreBluetooth根本不处理经典蓝牙的广播包,所以指定HID相关的服务UUID也没用——这些设备根本不会发送BLE广播。

希望这个方案能帮你解决问题!

内容的提问来源于stack exchange,提问作者Max Kraev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:10:21