Swift 3 - How to make timer work in background

后端 未结 9 412
忘掉有多难
忘掉有多难 2020-11-30 09:43

i am trying to do an application which can make a timer run in background.

here\'s my code:

let taskManager = Timer.scheduledTimer(timeInterval: 10,          


        
相关标签:
9条回答
  • 2020-11-30 10:36

    you can go to Capabilities and turn on background mode and active Audio. AirPlay, and picture and picture.

    It really works . you don't need to set DispatchQueue . you can use of Timer.

    Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (t) in
    
       print("time")
    }
    
    0 讨论(0)
  • 2020-11-30 10:38

    You can achieve this by getting the time-lapse between background and foreground state of the app, here is the code snippet.

    import Foundation import UIKit

    class CustomTimer {

    let timeInterval: TimeInterval
    var backgroundTime : Date?
    var background_forground_timelaps : Int?
    
    
    init(timeInterval: TimeInterval) {
        self.timeInterval = timeInterval
    }
    
    private lazy var timer: DispatchSourceTimer = {
        let t = DispatchSource.makeTimerSource()
        t.schedule(deadline: .now() + self.timeInterval, repeating: self.timeInterval)
        t.setEventHandler(handler: { [weak self] in
            self?.eventHandler?()
        })
        return t
    }()
    
    var eventHandler: (() -> Void)?
    
    private enum State {
        case suspended
        case resumed
    }
    
    private var state: State = .suspended
    
    deinit {
        NotificationCenter.default.removeObserver(self, name: UIApplication.didEnterBackgroundNotification, object: nil)
        NotificationCenter.default.removeObserver(self, name: UIApplication.willEnterForegroundNotification, object: nil)
        timer.setEventHandler {}
        timer.cancel()
        resume()
        eventHandler = nil
    }
    
    func resume() {
        
        NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackgroundNotification), name: UIApplication.didEnterBackgroundNotification, object: nil)
        
        NotificationCenter.default.addObserver(self, selector: #selector(willEnterForegroundNotification), name: UIApplication.willEnterForegroundNotification, object: nil)
        
        if state == .resumed {
            return
        }
        state = .resumed
        timer.resume()
    }
    
    func suspend() {
        if state == .suspended {
            return
        }
        state = .suspended
        timer.suspend()
    }
    
    
    @objc fileprivate func didEnterBackgroundNotification() {
        self.background_forground_timelaps = nil
        self.backgroundTime = Date()
    }
    
    @objc fileprivate func willEnterForegroundNotification() {
        // refresh the label here
        self.background_forground_timelaps = Date().interval(ofComponent: .second, fromDate: self.backgroundTime ?? Date())
        self.backgroundTime = nil
    }
    

    }

    Use this class like;

    self.timer = CustomTimer(timeInterval: 1)
            self.timer?.eventHandler = {
                DispatchQueue.main.sync {
                   
                    var break_seconds = self.data.total_break_sec ?? 0
                        break_seconds += 1
                        if self.timer?.background_forground_timelaps != nil && self.timer?.backgroundTime == nil{
                            break_seconds += (self.timer?.background_forground_timelaps)!
                            self.timer?.background_forground_timelaps = nil
                        }
                        self.data.total_break_sec = String(break_seconds)
                        self.lblBreakTime.text = PRNHelper.shared.getPlainTimeString(time: TimeInterval(break_seconds))
                    
                }
            }
            self.timer?.resume()
    

    This way I am able to get the timer right when resumed the app from background.

    0 讨论(0)
  • 2020-11-30 10:39

    A timer can run in the background only if both the following are true:

    • Your app for some other reason runs in the background. (Most apps don't; most apps are suspended when they go into the background.) And:

    • The timer was running already when the app went into the background.

    0 讨论(0)
提交回复
热议问题