Приложение находится в фоновом режиме, и оно получает обратный вызов при отключении от устройства BLE, после чего приложение должно некоторое время ждать (1 минуту), а затем выполнить какой-то фрагмент кода. Приложение работает должным образом даже в фоновом режиме и просто подключено к системе (Mac, Windows или Ubuntu), но не иначе. Такое поведение наблюдается только на iOS 11.3, а не на 10.3.
Когда приложение находится в фоновом режиме и получает обратный вызов, когда устройство BLE отключено, приложение регистрируется для фоновой задачи с таймером 1 минута, после чего должен быть выполнен определенный вызов API.
Ниже были мои наблюдения:
- Если устройство подключено к системе, все фоновые задачи и API
звонки сделаны изящно.
- Если устройство не подключено к системе, тогда фоновая задача и вызовы API не выполняются в iOS 11.3, но отлично работают на 10.3 (если таймер больше 10 секунд, то нормально работает на 10.3, но не на 11.3)
- Когда я выполняю беспроводную отладку, соединение с iPhone автоматически теряется через несколько секунд (> 10). (Такое поведение наблюдается в 11.3)
- Когда таймер меньше или равен 10 секундам, приложение отлично работает на всех версиях и даже не подключено ни к одной системе.
Это код в AppDelegate для запуска таймера в фоновом режиме:
func startTimerWith(timeInterval: TimeInterval) {
registerBackgroundTask()
timer = Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: false, block: { (timer) in
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "Time"), object: nil)
self.endBackgroundTask()
})
}
func registerBackgroundTask() {
backgroundTask = UIApplication.shared.beginBackgroundTask(expirationHandler: {
self.endBackgroundTask()
})
}
func endBackgroundTask() {
print("Background task ended.")
UIApplication.shared.endBackgroundTask(backgroundTask)
backgroundTask = UIBackgroundTaskInvalid
timer?.invalidate()
timer = nil
}
При отключении от устройства BLE я запускаю таймер, регистрируясь в фоновом режиме:
func disconnected(_ peripheral: CBPeripheral, with error: Error?) {
print("DISCONNECTED!!!")
AppDelegate.sharedApp().startTimerWith(timeInterval: TimeInterval(TIME))
BLEDeviceHandler.sharedInstance.handleBLEDevice(connectedPeripheral!)
}