2018年2月28日水曜日

App NapによってNSTimerなどが停止

環境
macOS Sierra (10.12.6), XCode9.2

問題
アプリが他のアプリの裏側に移動するなど、バックグラウンドに移動した際に、40秒程度でNSTimerなどの動作が停止する問題。

原因
macOS10.9から導入されたApp Napによって、バックグラウンドに回ったアプリのスレッドが停止するため。

解決
NSProcessInfoのシングルトンにbeginActivityWithOptions:reason:メソッドで背景に移動してもスレッドを停止しないようにする。
(※beginActivityWithOptions:の戻り値をretainして保持しなければならない。)

以下、例
activity = [[[NSProcessInfo processInfo] beginActivityWithOptions:NSActivityIdleSystemSleepDisabled|NSActivitySuddenTerminationDisabled reason:@"Sending OSC in Background."] retain];


参考:
https://stackoverflow.com/questions/19847293/disable-app-nap-in-macos-10-9-mavericks-application
https://arstechnica.com/gadgets/2013/10/os-x-10-9/15/#app-nap-api
https://developer.apple.com/library/content/releasenotes/MacOSX/WhatsNewInOSX/Articles/MacOSX10_9.html#//apple_ref/doc/uid/TP40013207-CH100

0 件のコメント: