由于 API 滥用,CoreBluetooth 与未使用的外围设备断开连接

Cal*_*ter 2 ios core-bluetooth swift cbperipheralmanager

我正在尝试从带有 CoreBluetooth 的 iPad 连接到 MacBook Pro。

这是我的代表团CBCentralManagerDelegate

extension MasterViewController: CBCentralManagerDelegate {
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        if central.state == .poweredOn {
            print("Scanning for peripherals")
            central.scanForPeripherals(withServices: nil, options: nil)
            Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(self.stopScan), userInfo: nil, repeats: true)
        }
    }

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        print("Did discover peripheral", peripheral)

        central.connect(peripheral, options: nil)

    }

    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        print("Did connect to ", peripheral)

        peripheral.delegate = self
        self.remotePeripheral.append(peripheral)
    }

    func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {}
}
Run Code Online (Sandbox Code Playgroud)

但是当我扫描时,我在日志中收到此错误:

<Error>: [CoreBluetooth] API MISUSE: Cancelling connection for unused peripheral
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?

Cal*_*ter 5

不知道为什么会这样,但我发现如果我将外围设备委托分配给 self 并连接到它之前将外围设备添加到数组中,它就可以工作。

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
    print("Did discover peripheral", peripheral)

    peripheral.delegate = self
    self.remotePeripheral.append(peripheral)

    central.connect(peripheral, options: nil)

}
Run Code Online (Sandbox Code Playgroud)

  • 您需要保留对 CBPeripheral 的引用,否则它们将被释放。这不是关于“委托销售”,而是更多关于`self.remotePeripheral.append(peripheral)`。 (3认同)