iOS设备锁屏/闭屏后计时器不运行

3
该应用在后台时,当与蓝牙设备断开连接时会收到回调,之后应用需要等待一段时间(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!)
} 
2个回答

0

这里有两个关键点:

  1. 如果应用程序在后台状态超过10分钟,则计时器将不起作用。我曾经遇到过一个确切的场景,在后台执行某些操作。我发现在10分钟后,计时器无法工作。
  2. 当设备被锁定时,计时器不起作用。一旦设备被锁定,应用程序立即挂起。这适用于iOS >= 7.0

  1. 应用在后台,当与BLE设备断开连接后,应用必须启动计时器。一分钟后,应用必须进行API通信。当应用在后台运行但屏幕未关闭时,此功能正常工作(如果屏幕打开,则应用按预期工作)。但问题是,当屏幕关闭时,计时器无法正常工作。
  2. 计时器在iOS 10.3中工作正常,但在11.3中不起作用。请帮忙解决。
- yuvaraju

0

问题已经解决,是因为应用程序使用了位置服务,但当应用程序在后台时,我忘记给予更新位置的权限。


嗨yuvaraju,你所说的“在应用程序后台更新位置时给予权限”是什么意思?我也有同样的问题,当屏幕关闭时,后台任务似乎停止了,我的计时器在这种情况下不会触发。在应用程序设置中,我将“位置”设置为“始终”,这是你所说的吗?我正在使用iOS 12.1.4进行测试。 - Andrea Gorrieri
嗨,Andrea Gorrieri,很抱歉回复晚了。我在我的应用程序中使用位置服务,当应用程序进入后台时,位置更新不会发生。后来,我给出了以下权限,然后我的应用程序开始按预期工作。 locationManager?.allowsBackgroundLocationUpdates = true locationManager?.pausesLocationUpdatesAutomatically = true - yuvaraju

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接