didDiscover 外围设备未调用

Posted

技术标签:

【中文标题】didDiscover 外围设备未调用【英文标题】:didDiscover peripheral not called 【发布时间】:2016-12-12 14:12:06 【问题描述】:

我想使用 CBCentralManager 来查找我周围的蓝牙低功耗外围设备。 centralManager 正在启动,它正确启动并且正在扫描。但是 didDiscover 函数永远不会被调用。我阅读了有关此问题和类似问题的所有其他帖子,并且 99% 确定我的问题的原因不同。尽管如此,我还是找不到我做错了什么。

import Foundation
import CoreBluetooth

@objc(SmallerBeaconServiceImpl)
class SmallerBeaconServiceImpl : NSObject, CBCentralManagerDelegate, CBPeripheralDelegate 

    private let centralManager : CBCentralManager

    func centralManagerDidUpdateState(_ central: CBCentralManager) 
        if central.state == CBManagerState.poweredOn && isRunning 
            startScanningForPeripherals()
        
        print("updated state: \(central.state)")
    

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) 
        print(peripheral.name ?? "no name")
    

    func startScanningForPeripherals() 
        if centralManager.state != CBManagerState.poweredOn 
            return
        

        centralManager.scanForPeripherals(withServices: nil, options: nil)
        print("is scanning: \(centralManager.isScanning)")
    


    private(set) var isRunning = false

    func startListening() 
        if isRunning 
            return
        

        isRunning = true

        print("started.")
        startScanningForPeripherals()
    

    func stopListening() 
        if !isRunning 
            return
        
        isRunning = false

        centralManager.stopScan()
    

    override init() 
        centralManager = CBCentralManager()
        super.init()

        print("initiated")
    

【问题讨论】:

你没有设置centralManager的代理。 @Larme:我肯定会添加它作为答案,以便它可以被接受。 这绝对有帮助。谢谢你!我很乐意将此标记为正确答案! 【参考方案1】:

optional func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) 是一个CBCentralManagerDelegate 方法。

您的课程SmallerBeaconServiceImpl 符合CBCentralManagerDelegate,但您没有设置centralManager delegate (CBCentralManagerDelegate) 属性。这就是为什么不调用 centralManager(_central:didDiscover:advertisementData:rssi) 的原因。

这可以通过以下方式解决:

centralManager = CBCentralManager(delegate: self, queue: nil)

【讨论】:

以上是关于didDiscover 外围设备未调用的主要内容,如果未能解决你的问题,请参考以下文章

在后台没有得到 didDiscover 外围 ibeacon

IOS 蓝牙未发现外围服务。 (有时!)

XCode:如何通过 UUID 连接到 BLE 外围设备?

未调用 BLE 外设委托

是否可以使用 CBPeripheral 通过蓝牙从 iOS 连接到 macOS

iOS 未检测到新的外围设备名称