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