使NSTIMER在物理设备的背景中运行



我有一个我制作的计时器应用程序。

当我在模拟器上的iPhone X上运行它时,计时器将在后台运行,但是当我在物理设备(iPad Pro)上测试它时,它不会在后台运行。

  • 当我在后台说时,我的意思是,当您按下设备顶部(iPad)/侧(iPhone)的OFF按钮时,屏幕变黑了。

这是代表模拟器上的故障,还是我不知道的东西,还是我需要更改的应用程序,以使其在物理设备的背景下工作?

谢谢

在didbackground:

  1. 停止常规二聚体。
  2. 开始新的BackgroundTaskTimer

在WillForeground:

  1. 停止背景任务。
  2. 启动常规二聚体

在下面找到示例代码:

在AppDelegate中:

声明:

  var backgroundUpdateTask: UIBackgroundTaskIdentifier!
  var backgroundTaskTimer:Timer! = Timer()

实施:

func doBackgroundTask() {
    DispatchQueue.global(qos: .default).async {
        self.beginBackgroundTask()
        if self.backgroundTaskTimer != nil {
            self.backgroundTaskTimer.invalidate()
            self.backgroundTaskTimer = nil
        }
        //Making the app to run in background forever by calling the API
        self.backgroundTaskTimer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(self.startTracking), userInfo: nil, repeats: true)
        RunLoop.current.add(self.backgroundTaskTimer, forMode: RunLoopMode.defaultRunLoopMode)
        RunLoop.current.run()
        // End the background task.
        self.endBackgroundTask()
    }
}
func beginBackgroundTask() {
    self.backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(withName: "Track trip", expirationHandler: {
        self.endBackgroundTask()
    })
}
func endBackgroundTask() {
    UIApplication.shared.endBackgroundTask(self.backgroundUpdateTask)
    self.backgroundUpdateTask = UIBackgroundTaskInvalid
}

在ApplicationDidenterBackground:

 func applicationDidEnterBackground(_ application: UIApplication) {
    //Start the background fetch
                self.doBackgroundTask()
        }

在ApplicationWillenterForeground:

func applicationWillEnterForeground(_ application: UIApplication) {
    if self.backgroundTaskTimer != nil {
        self.backgroundTaskTimer.invalidate()
        self.backgroundTaskTimer = nil
    }
}

相关内容

  • 没有找到相关文章

最新更新