最近在做Mac,windos上的音视频开发,遇到一个比较诡异的问题,在mac平台,使用libwebsocket后,只要没有信令的数据流动,一段时间后,websocket莫名其妙就被断了,分析了很久,都没找到原因。
即使加了ping,pong心跳,都维持不了链接,很多时候ping发出去,pong需要20s以上才返回,还找过服务端的同事一起协助排查,最终偶然发现,只要应用不再前台(失去焦点也算),就会出现,好了,有思路了,多半和mac上的应用生命周期有关系,研究了半天,发现这是触发了mac上的nap功能。
App Nap 是 OS X 10.9 Mavericks 的一项新功能。它能帮你在同时运行多个应用程序时节省电能。OS X
能够发现完全隐藏在窗口背后的应用程序。如果某个应用程序没有为你做任何事,比如播放音乐、下载文件或查收电子邮件,App Nap
会将该应用程序减速以节省宝贵的电池使用时间。不过,只要你再次使用该应用程序时,它就会立即恢复全速运行。这一切衔接得流畅无缝,你会以为它一直都是在运作的。App
Nap 也同样适用于 Safari 的标签页,只有看得到的标签页才会保持全速运行。通过 App Nap,处理器的能源消耗可以减少达 23%
之多。
简单的说,就是一旦应用失去了焦点,或者退到后台,还有其它类似没有使用音视频等条件,满足了Nap的触发机制,就会触发这个FP。然后系统会挂起你的进程达到省电,节约资源等目的。那么如何解决呢?其实系统也是提供了方法的,代码如下
@implementation AppDelegate {
id <NSObject> _activity;
}
-(void)applicationDidFinishLaunching:(NSNotification *)notification {
NSActivityOptions options = NSActivityUserInitiatedAllowingIdleSystemSleep;
NSString *reason = @"No napping on the job!";
_activity = [[NSProcessInfo processInfo] beginActivityWithOptions:options reason:reason];
}
-(void)applicationWillTerminate:(NSNotification *)notification {
[[NSProcessInfo processInfo] endActivity:_activity];
_activity = nil;
}
希望这个发现能节约你几天的时间