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

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)")
    }
}

关键修改点

  1. 修正代理方法签名:改成Swift 3要求的centralManager(_:didDiscover:advertisementData:rssi:),参数名称和类型完全匹配系统API
  2. 优化设备名称打印:考虑到有些BLE设备可能不会主动广播peripheral.name,可以从广播数据CBAdvertisementDataLocalNameKey字段 fallback 获取,避免输出空值
  3. 完善状态打印:在蓝牙未就绪时输出具体状态值,方便排查问题

额外注意事项

  • 必须使用真实iOS设备测试BLE功能,模拟器不支持Core Bluetooth
  • 别忘了在Info.plist中添加蓝牙权限描述:
    • iOS 13及以上:添加NSBluetoothAlwaysUsageDescription,说明APP使用蓝牙的目的
    • iOS 12及以下:添加NSBluetoothPeripheralUsageDescription
  • 如果只想扫描特定设备,可以把scanForPeripherals的withServices参数改成目标设备的服务UUID数组,这样能减少无效扫描结果

内容的提问来源于stack exchange,提问作者Hajime Kuge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:53:38