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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 10:15:05