首页 > 解决方案 > iOS:获取 API 误用:取消未使用外围设备的连接

问题描述

我有一个持有CBPeripheral数组的单例类。发现新设备时,会将其添加到该阵列中。该数组用作UITableView数据源。CBPeripheral当用户选择表格视图单元格时,将通过 fetch连接到选定的单元格。

不幸的是,我收到了这个错误:

[CoreBluetooth] API MISUSE:取消未使用外围设备的连接<CBPeripheral: 0x1c0103e70, identifier = xxx, name = xxx, state = connecting>,您是否忘记保留对它的引用?

我搜索了堆栈溢出,之前也有人问过类似的问题,但他们都说根本原因是“没有将外围设备添加到强引用,所以iOS释放它”。但我已将它们添加到数组中。

代码:

class BLEManager:NSObject, CBCentralManagerDelegate, CBPeripheralDelegate {

static let sharedInstance = BLEManager()
var centralManager: CBCentralManager!
var connectedService: BLEDSPService?
var delegate: BLEDiscoveryDelegate?

var readUUIDString: String
var writeUUIDString: String
var serviceUUIDString: String

var connectedPeripheral: CBPeripheral?

var peripherals = [CBPeripheral]() {
    didSet {
        delegate?.peripheralDidDiscoverNewOnes()

    }
}

init(serviceUUIDString: String, readUUIDString: String, writeUUIDString: String) {

    self.readUUIDString = readUUIDString
    self.writeUUIDString = writeUUIDString
    self.serviceUUIDString = serviceUUIDString
    super.init()
    centralManager = CBCentralManager(delegate: self, queue: DispatchQueue.main);
}

internal func startScanning() {

    let serviceUUID = CBUUID(string: serviceUUIDString)
    let options = [CBCentralManagerScanOptionAllowDuplicatesKey: 0]
    centralManager.scanForPeripherals(withServices: [serviceUUID], options: options)

}

func stopScanning() {
    centralManager.stopScan()
    delegate?.peripheralDidStopScan()
}



open func connectTo(index: Int) {    
    if let current = connectedPeripheral {
        disconnectPeripheral(current)
    }
    if index < peripherals.count {
        connectPeripheral(peripherals[index])
        stopScan()
    }
}

 @objc func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
    guard let name = peripheral.name?.lowercased() else {
        return
    }
    guard (name.contains(NamesManager.shared.scanName)) else {
        return
    }
    if !peripherals.contains(peripheral) {
        peripherals.append(peripheral)
        delegate?.peripheralDidDiscovered()
    }
}

但是,如果我将外围设备保存到 var,然后连接它。有用:

var connectedPeripheral: CBPeripheral?

open func connectTo(index: Int) {

    if let current = connectedPeripheral {
        connectPeripheral(current)
    }
    stopScan()

}

@objc func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {

    guard let name = peripheral.name?.lowercased() else {
        return
    }
    guard (name.contains(NamesManager.shared.scanName)) else {
        return
    }

        if !peripherals.contains(peripheral) {
            connectedPeripheral = peripheral
            peripherals.append(peripheral)
            stopScanning()
            delegate?.peripheralDidDiscovered()
        }
}

标签: iosswiftcore-bluetooth

解决方案


推荐阅读