【问题标题】:didDiscover peripheral not calleddidDiscover 外围设备未调用
【发布时间】: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:我肯定会将其添加为答案,以便可以接受。
  • 这绝对有帮助。谢谢你!我很乐意将此标记为正确答案!

标签: swift3 core-bluetooth


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    相关资源
    最近更新 更多