iOS Swift中无法获取已连接/附近蓝牙设备(无线耳机名称)的技术咨询
解决iOS获取已连接蓝牙设备名称的问题
我来帮你梳理下你遇到的问题,咱们一步步搞定它:
核心问题分析
你现在的情况是耳机已经和iPhone配对连接,但只有centralManagerDidUpdateState触发,其他代理没反应,主要有两个原因:
- 已连接设备不会触发扫描代理:
scanForPeripherals是用来找未连接、正在广播的外围设备,已经配对的设备不会被扫描到,得用专门的方法获取。 - 代理方法签名错误:你写的
didConnect和didFailToConnect方法参数格式不对,系统根本不会调用这些方法!
具体解决步骤
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




