如何在后台启动iOS Swift

ie3xauqp  于 2023-03-22  发布在  Swift
关注(0)|答案(1)|浏览(221)

我启动了一个计时器,我运行了一个功能,在5分钟计时器结束后做一些任务,但我的应用程序进入后台,计时器停止,代码不执行。
这是我代码

func startTimerr() {
    fivMinTimer?.invalidate()

    let seconds = 1.0
    fivMinTimer = Timer.scheduledTimer(timeInterval: seconds, target: self, selector: #selector(timerHandler(_:)), userInfo: nil, repeats: true)
    
}

func stopTimerr() {
    fivMinTimer?.invalidate()
}

@objc func timerHandler(_ timer: Timer) {
    self.timee += 1
    debugPrint("timer is -> >>> >>>>",timee)
   
    if timee == 300 {
        self.stopTimerr()
**// want to execute code here**
}

我在后台线程上启动计时器。这是否可能在后台激活计时器。请建议。

6rqinv9w

6rqinv9w1#

是的,iOS应用程序可以在后台运行计时器。
不过,iOS操作系统对后台进程有一定的限制,包括定时器,默认情况下,当应用移至后台或设备锁定时,iOS会暂停应用的执行。
要在后台运行计时器,您的应用必须首先请求用户的权限并启用相应的后台模式。您可以通过在Xcode中为应用的目标添加“后台模式”功能,并根据您的具体用例选择“后台获取”或“远程通知”选项来实现这一点。
参见:https://developer.apple.com/documentation/backgroundtasks/bgtaskscheduler
一旦您的应用被授予权限并启用后台模式,您就可以使用计时器执行后台任务,例如刷新数据、发送位置更新或下载新内容。但是,请记住,您的应用在后台运行的时间以及执行后台任务的频率仍有限制。
此外,重要的是要注意,在后台运行计时器会影响设备的电池寿命,因此只有在必要时才明智地使用它们。
示例:

import UIKit
import BackgroundTasks

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Register the background task identifier
        BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.example.timerTask", using: nil) { task in
            self.handleAppRefresh(task: task as! BGAppRefreshTask)
        }
        
        // Schedule the background task to run every 15 minutes
        scheduleBackgroundTask()
    }
    
    func scheduleBackgroundTask() {
        let request = BGAppRefreshTaskRequest(identifier: "com.example.timerTask")
        request.earliestBeginDate = Date(timeIntervalSinceNow: 900) // 15 minutes
        
        do {
            try BGTaskScheduler.shared.submit(request)
        } catch {
            print("Could not schedule background task: \(error.localizedDescription)")
        }
    }
    
    func handleAppRefresh(task: BGAppRefreshTask) {
        // Create and start the timer
        let timer = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: true) { timer in
            // Do some background task, such as refreshing data or updating the UI
            print("Background task is running")
        }
        
        // Finish the task when the timer completes
        timer.synchronize { _ in
            task.setTaskCompleted(success: true)
        }
    }
}

相关问题