iOS BLE CentralManager didFailToConnect 到外围设备未被调用

iOS BLE CentralManager didFailToConnect to peripheral not being called

如果外围设备已被中央发现,但就在用户按下按钮进行连接之前,外围设备超出范围,因此无法完成连接。 CoreBluetooth调用了什么方法? 我认为 centralManager didFailToConnect 会被调用,但在我的代码中它没有被调用,也许是因为连接根本没有启动? 在这种情况下,我应该使用哪种方法。 在此先感谢您的帮助。

public func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {

    print("[ERROR] Could not connect to peripheral \(peripheral.identifier.uuidString) error: \(error!.localizedDescription)")
}

在这种情况下不会调用任何东西,因为外围设备没有连接,也没有连接到外围设备的错误。

Core Bluetooth 将有一个与该外设的挂起连接,一旦它回到范围内,连接就会完成,didConnectPeripheral 将被调用。

如前一个答案所述,如果任何设备未启动连接过程,将调用 none 委托方法。didFailToConnect 方法仅在设备启动连接过程时调用,但由于任何原因该设备无法连接。

如果你想检查是否有任何设备可以连接,那么你需要为特定时间段创建一个计时器,如果在此期间没有扫描到任何设备,那么你可以显示一条消息显示 "no device available" 并再次检查设备。

我遇到过类似的情况,

我需要的是处理用户已经发现设备但在尝试连接之前等待了一段时间并且设备可能无法再连接的情况。

我不需要任何复杂的解决方案来维护设备的“范围内”状态,只需一个解决方案即可重新检查之前发现的设备是否仍在范围内,而无需实际维护任何状态。

我用下面的方法解决了它:

  1. 我创建了一个大约 5 秒的超时逻辑(如果在超时之前连接成功,我们将使其无效)以及连接请求操作。

  2. 如果在5秒内没有建立连接,超时块将在先前发现的外设上执行断开连接请求,这将导致didFail委托被中央管理器调用。

    Timer.scheduledTimer(withTimeInterval: 5, repeats: false, block: { timer in
                DEVICE_SCANNER_MANAGER.disconnectPeripheral()
                DispatchQueue.main.async {
                    Utility.showAlert(vc: self, title: "", msg: "device went out of range", btnPrimary: "OK", handler: nil)
                }
            })
    

DEVICE_SCANNER_MANAGER => 自定义管理器class 处理所有外设相关操作。