防止后台应用

时间:2018-05-24 14:47:59

标签: objective-c macos cocoa nstimer

我正在开发一个macOS应用程序(我们称之为“显示应用程序”),它显示时钟和其他数据,由同一台计算机上的另一个应用程序(“控制应用程序”)通过TCP连接控制。我注意到当显示应用程序空闲一段时间(> 60秒)然后安排NSTimer(间隔为.2秒)时,在计时器之前需要很长时间非常第一次触发(在6-10秒的范围内,有时更长。)这种情况主要发生在显示应用程序不在最前面(因为控制应用程序是。)一旦计时器第一次触发,它按预期工作(有一些小的,预期的计时器延迟)一段时间。

但是当计时器运行很长时间(超过5分钟)时,触发之间也存在类似的极端延迟(也是6-10秒)。看起来像是手动调度计时器

[[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];

稍微推迟一下这个问题(使用[NSTimer scheduledTimer...]会使问题出现的时间比手动将其添加到runloop时更早出现。)

这会导致很多麻烦,因为在此期间时钟没有更新。

我认为这是因为macOS以某种方式将显示应用程序视为“空闲”或“非活动”。

有没有办法预防,控制或规避这种行为?

1 个答案:

答案 0 :(得分:2)

这是App Nap。显示应用可以执行以下操作以避免小睡:

id activity = [[NSProcessInfo processInfo] beginActivityWithOptions:NSActivityUserInitiatedAllowingIdleSystemSleep reason:@"whatever"];

当它可以再次打盹时,你应该这样做:

[[NSProcessInfo processInfo] endActivity:activity];