You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS Swift中无法获取已连接/附近蓝牙设备(无线耳机名称)的技术咨询

解决iOS获取已连接蓝牙设备名称的问题

我来帮你梳理下你遇到的问题,咱们一步步搞定它:

核心问题分析

你现在的情况是耳机已经和iPhone配对连接,但只有centralManagerDidUpdateState触发,其他代理没反应,主要有两个原因:

  1. 已连接设备不会触发扫描代理scanForPeripherals是用来找未连接、正在广播的外围设备,已经配对的设备不会被扫描到,得用专门的方法获取。
  2. 代理方法签名错误:你写的didConnectdidFailToConnect方法参数格式不对,系统根本不会调用这些方法!

具体解决步骤

1. 修复代理方法的签名

把你代码里的这两个方法改成正确的写法:

// 正确的连接成功代理方法
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    print("Connected to \(peripheral.name ?? "Unknown Device")")
    self.bluetoothNameLabel.text = peripheral.name
}

// 正确的连接失败代理方法
func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
    print("连接失败:\(error?.localizedDescription ?? "Unknown Error")")
}

你原来的写法少了参数前面的下划线,不符合CoreBluetooth的代理方法签名规范,所以系统识别不到。

2. 获取已连接的蓝牙设备

因为你的小米耳机已经和iPhone连接了,直接调用retrieveConnectedPeripherals就能拿到它,不用扫描。在centralManagerDidUpdateState.poweredOn分支里添加这段代码:

case .poweredOn:
    print("central.state is .poweredOn")
    self.bluetoothNameLabel.text = "Bluetooth is powered ON"
    
    // 获取所有已连接的蓝牙设备
    let connectedPeripherals = centralManager?.retrieveConnectedPeripherals(withServices: nil) ?? []
    for peripheral in connectedPeripherals {
        if let deviceName = peripheral.name {
            print("找到已连接设备:\(deviceName)")
            self.bluetoothNameLabel.text = deviceName
            // 如果需要和设备交互(比如读特征值),记得设置代理
            peripheral.delegate = self
        }
    }

如果想精准定位小米耳机,可以查一下它的蓝牙服务UUID,把nil换成对应的UUID数组,这样就不会拿到其他蓝牙设备了。

3. 扫描功能的优化(如果后续需要)

如果以后要扫描未连接的设备,你的扫描代码有个小问题:没有调用stopScan()停止扫描,记得补上:

@IBAction func btnScanClick( sender: Any) {
    print("scan Start")
    let options: [String: Any] = [CBCentralManagerScanOptionAllowDuplicatesKey:NSNumber(value: false)]
    centralManager?.scanForPeripherals(withServices: nil, options: options)
    // 这里其实不需要重复设置delegate,viewDidLoad里已经设置过了
    
    DispatchQueue.main.asyncAfter(deadline: .now() + 60.0) {
        print("Scanning stop")
        self.centralManager?.stopScan() // 加上这句停止扫描
    }
}

另外,已连接的设备通常不会再广播,所以扫描不到是正常的,别奇怪。

额外注意事项

  • 别忘了在Info.plist里添加蓝牙权限:iOS 13+需要NSBluetoothAlwaysUsageDescription,旧版本需要NSBluetoothPeripheralUsageDescription,否则蓝牙功能会被系统限制。
  • 如果要读取设备的更多信息(比如电量),设置peripheral.delegate = self后,调用peripheral.discoverServices(nil)来发现设备的服务和特征。

内容的提问来源于stack exchange,提问作者Anilkumar iOS Developer

火山引擎 最新活动