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

时间:2013-11-07 21:44:59

标签: objective-c macos

我正在编写一个接收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"];
}

查看github上的完整代码。

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:11)

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

@property (strong) id activity;

然后使用此实现。

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

感谢所有贡献者!

答案 1 :(得分:5)

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

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

App Occlusion

Window Occlusion

Occlusion Example 希望这会有所帮助。