Swift3开发iOS BLE测试应用:无法搜索并显示BLE设备名称
解决Swift 3中BLE设备扫描无响应及打印设备名称的问题
嘿,我看了你这段Swift 3的BLE测试代码,扫描不到设备的核心问题是代理方法的签名不符合Swift 3的语法规范,导致系统根本不会触发扫描到设备的回调,自然就看不到你想要的打印输出啦!
问题分析
你写的centralManager(central:didDiscoverPeripheral:advertisementData:RSSI:)是Objective-C风格的旧版方法签名,而Swift 3对Core Bluetooth的API做了标准化调整,参数名称、顺序和类型都有变化,系统无法识别这个方法,所以扫描到设备时不会调用它。
修正后的完整代码
import UIKit import CoreBluetooth class ViewController: UIViewController, CBCentralManagerDelegate { private var isScanning = false var centralManager: CBCentralManager! override func viewDidLoad() { super.viewDidLoad() self.centralManager = CBCentralManager(delegate: self, queue: nil) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func centralManagerDidUpdateState(_ central: CBCentralManager) { if central.state == .poweredOn { // 扫描所有BLE设备,也可以指定特定服务UUID来过滤 centralManager.scanForPeripherals(withServices: nil, options: nil) print("开始扫描BLE设备...") } else { print("蓝牙未就绪,当前状态:\(central.state.rawValue)") } } // 修正后的Swift 3版本代理方法 func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { // 打印设备名称,如果peripheral.name为空,也可以从advertisementData里取广播名称 let deviceName = peripheral.name ?? advertisementData[CBAdvertisementDataLocalNameKey] as? String ?? "未知设备" print("devicename: \(deviceName),设备UUID:\(peripheral.identifier.uuidString)") } }
关键修改点
- 修正代理方法签名:改成Swift 3要求的
centralManager(_:didDiscover:advertisementData:rssi:),参数名称和类型完全匹配系统API - 优化设备名称打印:考虑到有些BLE设备可能不会主动广播
peripheral.name,可以从广播数据CBAdvertisementDataLocalNameKey字段 fallback 获取,避免输出空值 - 完善状态打印:在蓝牙未就绪时输出具体状态值,方便排查问题
额外注意事项
- 必须使用真实iOS设备测试BLE功能,模拟器不支持Core Bluetooth
- 别忘了在
Info.plist中添加蓝牙权限描述:- iOS 13及以上:添加
NSBluetoothAlwaysUsageDescription,说明APP使用蓝牙的目的 - iOS 12及以下:添加
NSBluetoothPeripheralUsageDescription
- iOS 13及以上:添加
- 如果只想扫描特定设备,可以把
scanForPeripherals的withServices参数改成目标设备的服务UUID数组,这样能减少无效扫描结果
内容的提问来源于stack exchange,提问作者Hajime Kuge
相关产品推荐
相关产品推荐

