7

在Core Bluetooth中,连接到设备后,我关闭设备,设备断开连接。但是当我再次打开设备时,没有didDiscoverPeripheral再次调用。如何重新连接到设备?

4

4 回答 4

15

当您断开设备时,cancelPeripheralConnectiondidDisconnectPeripheral调用委托方法。然而,从 iOS 6.0 开始,设备保持连接状态大约 40-50 秒(或更长时间),因此didDiscoverPeripheral在该时间范围内不会调用 no。如果您想再次“发现”它,只需调用该retrieveConnectedPeripherals方法,您将在didRetrieveConnectedPeripherals.

但是,最好的解决方案是保存设备的 UUID 并使用该retrievePeripherals方法重新连接。这将调用didRetrievePeripherals,您可以重新连接connectPeripheral。这是重新连接到设备的最快方式,在这种情况下不需要扫描。

于 2012-11-16T09:55:12.630 回答
4

当您使用 进行扫描时scanForPeripheralsWithServices,它通常只会针对特定设备地址通知您一次。您可以通过指定选项将其更改为报告重复项CBCentralManagerScanOptionAllowDuplicatesKey。或者,您可以让您的应用程序检测到其他设备使用超时断开连接,然后重新开始扫描。

于 2012-11-08T15:33:52.960 回答
2

在 CoreBluetooth 中,所有管理都由应用层完成。在你的情况下,我会做的是监听断开事件而不是在同一事件中,重新连接外围设备。连接方法是一种便宜的方法,并确保您在设备回到范围内时重新连接到您的设备。

请注意,如果您明确断开设备连接,您会收到相同的断开连接事件,但您无需调用重新连接方法。

于 2013-01-14T22:05:35.570 回答
2

@Andras 给了我正确的道路,但自 iOS7 以来他的答案不再完整。

重新连接到以前的设备的最佳方法是使用该retrievePeripherals(withIdentifiers:)方法。

该方法不调用delegate,而是直接返回给你一个Peripherals列表,对应UUID传入的参数列表。

if let peripheral = self.centralManager.retrievePeripherals(withIdentifiers: [uuid]).first {
    self.peripheral = peripheral // <-- super important
    self.centralManager.connect(peripheral, options: nil)
}

请检查上面代码的“超级重要”行:该方法connect(_:option:)不保留外设,如果您不自己做,连接将永远失败,没有任何回调,因为外设对象将被破坏。

于 2019-03-25T14:13:10.407 回答