应用程序在后台,它在与BLE设备断开连接时收到回调,之后应用程序必须等待一段时间(1分钟),然后执行一些代码。如果屏幕打开,即使在后台,应用程序也会按预期运行。但是,如果关闭屏幕,则计时器不工作且应用程序未按预期执行。
这是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!)
}
答案 0 :(得分:0)
这里有两点至关重要:
- 如果应用处于后台状态的时间超过 10分钟,则定时器无法正常工作。我有一个确切的场景,我必须执行一些 在后台行动。我发现10分钟后,计时器没有 工作。
- 设备锁定时定时器不起作用。设备锁定后,应用会立即暂停。这适用于 iOS> = 7.0
醇>
答案 1 :(得分:0)
错误已修复,因为app使用了位置服务,但我忘了在应用处于后台时允许更新位置。