【问题标题】:Timers not running when screen is turned off / device is locked in iOS屏幕关闭/设备在 iOS 中锁定时计时器不运行
【发布时间】:2018-10-12 05:55:31
【问题描述】:

应用程序在后台,它在与 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!)
} 

【问题讨论】:

    标签: ios timer uibackgroundtask screen-off ios-background-mode


    【解决方案1】:

    错误已修复,因为应用程序使用位置服务,但我忘记在应用程序处于后台时授予更新位置的权限。

    【讨论】:

    • 嗨 yuvaraju,“当应用程序处于后台时授予更新位置的权限”是什么意思。我有同样的问题,当屏幕关闭并且我的计时器在这种情况下没有触发时,后台任务似乎停止了。在应用程序设置中,我将“位置”设置为“始终”是您的意思吗?我正在使用 iOS 12.1.4 进行测试
    • 您好 Andrea Gorrieri,抱歉回复晚了,我在我的应用程序中使用定位服务,当应用程序进入后台时,位置更新没有发生。后来我获得了以下许可,然后我的应用程序开始按预期工作。 locationManager?.allowsBackgroundLocationUpdates = true locationManager?.pausesLocationUpdatesAutomatically = true
    【解决方案2】:

    这里有两点很重要:

    1. 如果应用处于后台状态超过 10 分钟,计时器将不起作用。我有一个确切的场景,我必须执行一些 背景中的动作。我发现10分钟后,计时器没有 工作。
    2. 设备锁定时定时器不工作。一旦设备被锁定,应用程序会立即暂停。这适用于 iOS >= 7.0

    【讨论】:

    • 1.后台应用,与 BLE 设备断开连接后,应用必须启动计时器。一分钟后,应用程序必须进行 api 通信。这在应用程序处于后台但屏幕未关闭时有效(如果屏幕打开,应用程序按预期工作)。但这里的问题陈述是,当屏幕关闭时计时器不工作。 2. 计时器在 iOS 10.3 中工作正常,但在 11.3 中不支持。
    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多