Я борюсь с проблемой, которая заключается в том, что я не могу восстановить соединение с моим BLE-устройством, когда пользователь принудительно закрывает приложение.Мое приложение работает следующим образом:
- При первом запуске пользователь приложения должен подключиться к устройству BLE - это работает
- Когда приложение работает в фоновом режиме, соединения все еще работают
- Если я выключаю устройство BLE и включаю снова, соединение восстанавливается - работает
- Когда пользователь выходит и возвращается домой, соединение восстанавливается, и пользователь получает уведомление о том, что он находится близко к устройству - работает
Все это решается путем превращения Bluetooth 4.0 LE в iBeacon.Когда пользователь достаточно близко, iBeacon начинает посылать сигналы, и приложение iOS запускается, и пользователь получает push-уведомление, соединение восстанавливается.
Проблема возникает, когда пользователь принудительно покидает приложение.iBeacon по-прежнему работает, потому что, когда пользователь подключен к BLE, устройство BLE работает как устройство Bluetooth. Но когда соединение потеряно, BLE работает как iBeacon и рекламирует приложение iOS.Когда пользователь принудительно закрывает приложение, пользователь получает локальное push-уведомление о том, что приложение близко к iBeacon, так что это означает, что приложение перезапускается на пару секунд (я думаю, 10 секунд), но я не могу с этим восстановить соединение.
Это код для тигра уведомления и, как я надеялся, после повторного выхода BLE переподключится.
func locationManager(_ manager: CLLocationManager, didDetermineState state: CLRegionState, for region: CLRegion) {
// Check if the user's INSIDE the region, not outside...
guard state == CLRegionState.inside else { print("Error"); return }
if state == CLRegionState.inside{
let content = UNMutableNotificationContent()
content.title = "Device found!"
content.body = "You're close to your BLE Device, reestablish connection!"
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
let request = UNNotificationRequest(identifier: "1389402823904", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) { (err:Error?) in
}
centralManager.scanForPeripherals(withServices: nil, options: nil)
let uuid = UUID(uuidString: "74278BDA-B644-4520-8F0C-720EAF059935")!
guard let mainPeripheral = mainPeripheral else {return}
centralManager.connect(mainPeripheral, options: nil)
centralManager.retrievePeripherals(withIdentifiers: [uuid])
DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
self.centralManager.stopScan()
}
}
}
}
Для простоты, uuid жестко закодирован.Как я понимаю, didDeterminateState
запускается, когда iBeacon отправляет сигнал, и я проверяю CLRegionState
, находится ли область внутри, что означает, что рядом с iBeacon метод для локальных уведомлений получает триггеры, тогда мне нужно выполнить повторное сканирование для устройств BLE, чтобы яя звоню scanForPeripherals
, но не connect
метод.ScanForPeripherals
должен вызывать метод didDiscover
:
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
print(peripheral)
if peripheral.name == "DOPEY"{
peripheral.delegate = self
peripheral.discoverServices([HM_10_ServiceCharacteristic])
mainPeripheral = peripheral
centralManager.connect(peripheral, options: nil)
centralManager.stopScan()
}
}
Когда он находит DOPEY
имя периферийного устройства, устройство должно подключиться.Для тестов я использую HM-10 Bluetooth 4.0 LE.Когда пользователь принудительно выходит из приложения, он отправляет локальное push-уведомление, но не восстанавливает соединение.
Я с нетерпением жду любой помощи.Цените!