How to run NSTimer in background and sleep in iOS?

后端 未结 6 628
南笙
南笙 2021-02-04 21:56

I found a lot of post in stackoverflow about NSTimer run in background.

However I didn\'t find any solution.

In my app , I play sound in background

6条回答
  •  滥情空心
    2021-02-04 22:29

    I know this post is relatively old but I recently ran into this problem and was having some trouble figuring it out. This is the solution I came up with as of Swift 5. It uses a combination of the RunLoop and Timer classes, with information about them in the provided links below.

    Using timers

    • https://developer.apple.com/documentation/foundation/timer

    Using run loops


    • https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1

    • https://developer.apple.com/documentation/foundation/runloop

    Sample code:

    class AMSleepTimerUtil: NSObject {
        static let shared = AMSleepTimerUtil()
        fileprivate var sleepTimer: Timer?
        
        /// Initialize the timer to trigger a function to execute after a duration of time
        /// - Parameter seconds: the time delay until the selector function executes
        /// - Returns: true if sleep timer were successfully initialized
        func createTimerToStopMusic(at seconds: TimeInterval) -> Bool {
            let fireAtDate = Date(timeIntervalSinceNow: seconds)
            stopSleepTimer()
            
            self.sleepTimer = Timer(fireAt: fireAtDate,
                                    interval: 0,
                                    target: self,
                                    selector: #selector(pauseMusic),
                                    userInfo: nil,
                                    repeats: false)
            guard let sleepTimer = sleepTimer else { return false }
            RunLoop.main.add(sleepTimer, forMode: .common)
            
            return true
        }
        
        func pauseMusic() {
            guard let audioPlayer = AMNowPlayingViewController.sharedInstance()?.audioPlayer else { return }
            
            audioPlayer.pause()
        }
        
        /// Used to reset the sleep timer before initializing a new timer if the user clicks the "Set Timer" multiple times
        func stopSleepTimer() {
            if sleepTimer != nil {
                sleepTimer?.invalidate()
                sleepTimer = nil
            }
        }
        
        func sleepTimerIsActive() -> Bool {
            return self.sleepTimer != nil
        }
    }
    

提交回复
热议问题