在Core Bluetooth中,连接到设备后,我关闭设备,设备断开连接。但是当我再次打开设备时,没有didDiscoverPeripheral
再次调用。如何重新连接到设备?
4 回答
当您断开设备时,cancelPeripheralConnection
将didDisconnectPeripheral
调用委托方法。然而,从 iOS 6.0 开始,设备保持连接状态大约 40-50 秒(或更长时间),因此didDiscoverPeripheral
在该时间范围内不会调用 no。如果您想再次“发现”它,只需调用该retrieveConnectedPeripherals
方法,您将在didRetrieveConnectedPeripherals
.
但是,最好的解决方案是保存设备的 UUID 并使用该retrievePeripherals
方法重新连接。这将调用didRetrievePeripherals
,您可以重新连接connectPeripheral
。这是重新连接到设备的最快方式,在这种情况下不需要扫描。
当您使用 进行扫描时scanForPeripheralsWithServices
,它通常只会针对特定设备地址通知您一次。您可以通过指定选项将其更改为报告重复项CBCentralManagerScanOptionAllowDuplicatesKey
。或者,您可以让您的应用程序检测到其他设备使用超时断开连接,然后重新开始扫描。
在 CoreBluetooth 中,所有管理都由应用层完成。在你的情况下,我会做的是监听断开事件而不是在同一事件中,重新连接外围设备。连接方法是一种便宜的方法,并确保您在设备回到范围内时重新连接到您的设备。
请注意,如果您明确断开设备连接,您会收到相同的断开连接事件,但您无需调用重新连接方法。
@Andras 给了我正确的道路,但自 iOS7 以来他的答案不再完整。
重新连接到以前的设备的最佳方法是使用该retrievePeripherals(withIdentifiers:)
方法。
该方法不调用delegate,而是直接返回给你一个Peripheral
s列表,对应UUID
传入的参数列表。
if let peripheral = self.centralManager.retrievePeripherals(withIdentifiers: [uuid]).first {
self.peripheral = peripheral // <-- super important
self.centralManager.connect(peripheral, options: nil)
}
请检查上面代码的“超级重要”行:该方法connect(_:option:)
不保留外设,如果您不自己做,连接将永远失败,没有任何回调,因为外设对象将被破坏。