Swift: la aplicación BLE vuelve a conectar / escanear después de suspender

Actualmente estoy escribiendo una aplicación que se conecta a través de BLE a un dispositivo externo. Todas las operaciones están bien cuando la aplicación está en primer plano … incluida la connection, la obtención de datos y la reconnection (en los casos del dispositivo fuera de range) a través de un protocolo de reconnection que escribí. La aplicación también funciona correctamente cuando está en segundo plano, pero la connection BLE permanece viva.

Sin embargo, la única instancia en la que la aplicación no funciona es si la aplicación está en segundo plano y luego el dispositivo BLE se sale del range. Una vez que se interrumpe la connection, la aplicación parece estar suspendida por iOS después de unos segundos y ninguno del código que escribí seguirá funcionando … incluso si vuelvo a poner el dispositivo dentro del scope. La única forma de restaurar la funcionalidad es volver a poner la aplicación nuevamente en primer plano. (Nota: Tengo el file info.plist y todas las demás configuraciones configuradas apropiadamente para la funcionalidad de background de centralManager)

He leído algunos documentos y parece que esto se debe a que no se implementó correctamente el código de preservación / restauración del estado. Proseguí e implementé los commands "willRestoreState" y "didUpdateState", pero la aplicación aún no se vuelve a conectar a un dispositivo una vez que se ha suspendido en modo de background.

He mostrado un código relevante a continuación, que incluye los methods willRestoreState, didUpdateState y didDisconnect. ¿Ideas o sugerencias? ¡Gracias!

//define service+characteristic UUIDS let serviceUUID = CBUUID(string: "xxxxxxxxx") let streamingCharacteristicUUID = CBUUID(string: "xxxxxxxxx") //Local dictionary of UUIDs for connected devices (the ble code updates this var with each connected device) var devicesUniqueId:[UUID:String] = [UUID:String]() //Local dictionary of connected peripherals, with respect to each of their UUIDS (the ble code updates this var with each connected device) var sensorPeripheral = [UUID:CBPeripheral]() ///restreState function func centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any]) { if let peripheralsObject = dict[CBCentralManagerRestonetworkingStatePeripheralsKey] { let peripherals = peripheralsObject as! Array<CBPeripheral> print ("starting restrestate code") if peripherals.count > 0 { for i in 0 ..< peripherals.count { print ("starting restrecheck") //Check if the peripheral exists within our list of connected peripherals, and assign delegate if it does if self.devicesUniqueId.keys.contains(peripherals[i].identifier) { peripherals[i].delegate = self } } } } } func centralManagerDidUpdateState(_ central: CBCentralManager) { if central.state != .powenetworkingOn { return } self.startScanning() //////Preservation + Restoration code//////// //Iterate through array of connected UUIDS let keysArray = Array(self.patchDevicesUniqueId.keys) for i in 0..<keysArray.count { //Check if peripheral exists for given UUID if let peripheral = self.sensorPeripheral[keysArray[i]] { print("peripheral exists") //Check if services exist within the peripheral if let services = peripheral.services { print("services exist") //Check if pnetworkingefined serviceUUID exists within services if let serviceIndex = services.index(where: {$0.uuid == serviceUUID}) { print("serviceUUID exists within services") let transferService = services[serviceIndex] let characteristicUUID = streamingCharacteristicUUID //Check if pnetworkingefined characteristicUUID exists within serviceUUID if let characteristics = transferService.characteristics { print("characteristics exist within serviceUUID") if let characteristicIndex = characteristics.index(where: {$0.uuid == characteristicUUID}) { print("characteristcUUID exists within serviceUUID") let characteristic = characteristics[characteristicIndex] //If characteristicUUID exists, begin getting notifications from it if !characteristic.isNotifying { print("subscribe if not notifying already") peripheral.setNotifyValue(true, for: characteristic) } else { print("invoke discover characteristics") peripheral.discoverCharacteristics([characteristicUUID], for: transferService) } } } } else { print("invoke discover characteristics") peripheral.discoverServices([serviceUUID]) } } } } } //didDisconnect method to handle a connect command issue func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { //commented out unnecessary code self.removePeripheralData(peripheral: peripheral) if(sensorCount>0){ sensorCount -= 1 } } //removePeripheralData function used in didDisconnect func removePeripheralData ( peripheral: CBPeripheral) { //Commented out unnecessary code //Issue reconnect command print ("issuing reconnect command") centralManager.connect(peripheral, options: nil) //Commented out unnecessary code handleDidRemoveDevice() }