В Core Bluetooth после подключения к устройству я выключаю устройство, и оно отключается. Но когда я снова включаю устройство, didDiscoverPeripheral
снова не вызывается. Как снова подключиться к устройству?
Как я могу повторно подключиться к устройству после отключения в Core Bluetooth
Ответы (4)
Когда вы отключаете устройство с помощью cancelPeripheralConnection
, будет вызван метод делегата didDisconnectPeripheral
. Однако с iOS 6.0 устройство остается подключенным примерно 40-50 секунд (или больше), поэтому в этот период времени didDiscoverPeripheral
вызываться не будет. Если вы хотите «открыть» его снова, просто вызовите метод retrieveConnectedPeripherals
, и вы получите ссылку в didRetrieveConnectedPeripherals
.
Однако лучшим решением будет сохранить UUID устройства и использовать его для повторного подключения с помощью метода retrievePeripherals
. Это вызовет didRetrievePeripherals
, и вы сможете повторно подключиться к connectPeripheral
. Это самый быстрый способ переподключения к устройству, в этом случае сканирование не требуется.
Когда вы выполняете сканирование с помощью scanForPeripheralsWithServices
, оно обычно уведомляет вас только один раз для определенного адреса устройства. Вы можете изменить это, чтобы сообщать о дубликатах, указав опцию CBCentralManagerScanOptionAllowDuplicatesKey
. Или вы можете сделать так, чтобы ваше приложение обнаружило, что другое устройство отключилось по тайм-ауту, и перезапустило сканирование.
В CoreBluetooth все управление осуществляется на прикладном уровне. В вашем случае, что бы я сделал, это прослушать событие отключения, чем в том же событии повторно подключить периферийное устройство. Этот метод подключения является недорогим и гарантирует вам повторное подключение к вашему устройству, когда оно вернется в зону действия.
Обратите внимание, что если вы явно отключите устройство, вы получите то же самое событие отключения, но вам не нужно вызывать метод повторного подключения.
@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:)
не сохраняет периферийное устройство, и если вы не сделаете это самостоятельно, соединение всегда будет прерываться без какого-либо обратного вызова, поскольку периферийный объект будет уничтожен.