Macos Swift:在计算机处于睡眠状态时保持NSTimer运行(OSX)

Macos Swift:在计算机处于睡眠状态时保持NSTimer运行(OSX),macos,timer,nstimer,background-process,Macos,Timer,Nstimer,Background Process,我正在编写一个OSX应用程序,其中包括一个通用的秒表计时器。我正在使用NSTimer。我希望用户能够启动计时器,并在很长一段时间(比如30分钟)后返回,并且计时器仍在运行。问题是,我的计时器在电脑关闭或休眠时无法继续运行,我不想让电脑长时间处于打开状态。关于iOS应用程序的这个问题,有好几个线程,但没有一个(至少我已经发现)与OS X有关。有人知道这个问题的解决方法吗?举个例子,我试图模仿iOS自带的“时钟”应用程序的“秒表”功能,除了笔记本电脑而不是手机。即使手机长时间关机,“时钟”应用程序中

我正在编写一个OSX应用程序,其中包括一个通用的秒表计时器。我正在使用
NSTimer
。我希望用户能够启动计时器,并在很长一段时间(比如30分钟)后返回,并且计时器仍在运行。问题是,我的计时器在电脑关闭或休眠时无法继续运行,我不想让电脑长时间处于打开状态。关于iOS应用程序的这个问题,有好几个线程,但没有一个(至少我已经发现)与OS X有关。有人知道这个问题的解决方法吗?举个例子,我试图模仿iOS自带的“时钟”应用程序的“秒表”功能,除了笔记本电脑而不是手机。即使手机长时间关机,“时钟”应用程序中的秒表也会继续运行。

我想这样做的方法不是在后台实际运行
NSTimer
,而是找出应用程序进入后台和重新聚焦之间经过了多少时间。使用NSApplicationDelegate的委派方法
applicationWillResignActive:
applicationWillBecomeActive:

let timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(self), userInfo: nil, repeats: true)
var resignDate: NSDate?
var stopwatch = 0

func update() {
    stopwatch += 1
}

func applicationWillResignActive(notification: NSNotification) {
    timer.invalidate()
    resignDate = NSDate() // save current time 
}

func applicationWillBecomeActive(notification: NSNotification) {
    if resignDate != nil {
        let timeSinceResign = NSDate().timeIntervalSinceDate(resignDate!))
        stopwatch += Int(timeSinceResign)
        timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(self), userInfo: nil, repeats: true)
        resignDate = nil
    }
}
applicationWillResignActive:
将在每次应用程序失去焦点时被调用。发生这种情况时,我将当前日期(
NSDate()
)保存在名为
resignDate
的变量中。然后,当应用程序被重新激活时(在谁知道多长时间之后;这无关紧要)
应用程序将变为活动状态:
被调用。然后,我取另一个
NSDate
值,即当前时间,并找到当前时间和
resignDate
之间的时间量。在将这段时间添加到我的时间值后,我可以重新验证
NSTimer
,使其继续运行