在MacOS 10.9(Mavericks)应用程序中禁用App Nap

dan*_*ele 18 macos objective-c

我正在编写一个接收OSC消息的应用程序.但是,由于10.9的App-Nap技术,应用程序在离开前台后停止对这些消息做出反应.我想为我在10.9上运行的应用程序禁用AppNap,但仍然可以在10.8上运行,所以我尝试了这段代码,但它没有显示任何效果.

if ([[NSProcessInfo processInfo] respondsToSelector:@selector(beginActivityWithOptions:reason:)]) {
    [[NSProcessInfo processInfo] beginActivityWithOptions:0x00FFFFFF reason:@"receiving OSC messages"];
}
Run Code Online (Sandbox Code Playgroud)

查看github上的完整代码.

if条件似乎按预期工作,并在10.9机器上执行.但是,该应用程序被发送到睡眠状态.(Activity Monitor为我的应用程序显示"App Nap:Yes").

谢谢你的帮助!

dan*_*ele 12

活动需要存储在一个属性中.所以我在头文件中添加了这个:

@property (strong) id activity;
Run Code Online (Sandbox Code Playgroud)

然后使用此实现.

if ([[NSProcessInfo processInfo] respondsToSelector:@selector(beginActivityWithOptions:reason:)]) {
    self.activity = [[NSProcessInfo processInfo] beginActivityWithOptions:0x00FFFFFF reason:@"receiving OSC messages"];
}
Run Code Online (Sandbox Code Playgroud)

感谢所有贡献者!


Tom*_* C. 5

根据您对问题的描述,您可能需要查看WWDC 2013 704并查看背景连续工作部分(接近结束).查看setpriority命令的手册也可能有所帮助.我没有必要禁用app nap,但我认为手动更改进程优先级是一种很好的方法.

2013 WWDC Video 205(中间附近)描述了app nap的一些有趣方面,这些方面会影响应用程序是否受到限制.来自WWDC 2013的视频209呈现以下关于遮挡的截图(应用小睡参与的点)可能是有用的.

应用遮挡

窗口遮挡

遮挡示例 希望这可以帮助.