Xcode12.5 Swift5下scanForPeripherals传CBUUID数组无响应解决方案
CoreBluetooth调用scanForPeripherals传入指定CBUUID无扫描结果的解决方法
本文适配Xcode 12.5、Swift 5开发环境,针对使用CoreBluetooth框架时,向scanForPeripherals方法的withServices参数传入CBUUID数组后无扫描结果返回的问题,完整排查及解决过程如下:
步骤1:扫描附近所有设备获取标识符
先开启全量扫描,获取目标外设的唯一标识符,代码实现如下:
// // ViewController.swift // import UIKit import CoreBluetooth class ViewController: UIViewController, CBCentralManagerDelegate { private var centralManager : CBCentralManager! override func viewDidLoad() { super.viewDidLoad() centralManager = CBCentralManager(delegate: self, queue: nil, options: nil) } func centralManagerDidUpdateState(_ central: CBCentralManager) { if central.state == .poweredOn { centralManager.scanForPeripherals(withServices:nil, options: nil) } } public func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { guard let name = peripheral.name else { return } print("\nName : \(name)") print(peripheral.identifier)// 此处获取到设备标识符,示例:9SD480E0-4362-4412-6350-D143DC3D14BE } }
步骤2(错误做法):将设备标识符作为CBUUID传入扫描接口
直接把第一步拿到的设备标识符当作服务UUID传入扫描接口,会出现无设备返回的问题,错误实现如下:
// // ViewController.swift // import UIKit import CoreBluetooth class ViewController: UIViewController, CBCentralManagerDelegate { private var centralManager : CBCentralManager! override func viewDidLoad() { super.viewDidLoad() centralManager = CBCentralManager(delegate: self, queue: nil, options: nil) } func centralManagerDidUpdateState(_ central: CBCentralManager) { if central.state == .poweredOn { centralManager.scanForPeripherals(withServices: [CBUUID.init(string: "9SD480E0-4362-4412-6350-D143DC3D14BE")], options: nil) } } public func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { // 此处无任何设备回调 } }
步骤3:正确实现方案
思路由@Paulw11提供:设备标识符不等于服务UUID,要检索已知标识符的外设,应该调用retrievePeripherals方法,实现如下:
// // ViewController.swift // import UIKit import CoreBluetooth class ViewController: UIViewController, CBCentralManagerDelegate { private var centralManager : CBCentralManager! override func viewDidLoad() { super.viewDidLoad() centralManager = CBCentralManager(delegate: self, queue: nil, options: nil) } func centralManagerDidUpdateState(_ central: CBCentralManager) { if central.state == .poweredOn { guard let uuid = UUID(uuidString: "9SD480E0-4362-4412-6350-D143DC3D14BE") else { return } let result = centralManager.retrievePeripherals(withIdentifiers: [uuid]) print(result) // 成功获取到目标CBPeripheral对象 } } }
内容的提问来源于stack exchange,提问作者Evgeniy Poznyak
相关产品推荐
相关产品推荐

