Mervericksから追加されたApp Napという機能に悩まされたメモ

とあるアプリケーションの開発中に、ずーっと原因不明だったバグの
原因がこれだったのでメモ。

AppNapとは

MacOS X 10.9 (Mervericks)で搭載された新機能で
バックグラウンドで動作しているアプリケーション
のメモリを圧縮したり、処理をサスペンドしたりして、
バッテリーの消耗を抑えてくれる機能

AppNap -apple公式

一応、触れ込みではユーザに関わりのある処理を行っていない
アプリケーションの処理速度を下げ、アプリケーションが
フォアグラウンド(例えばウィンドウがアクティブ)になると
瞬時に復旧する、というような感じらしいです。

基本的にはありがたいんですが、リアルタイム性が求められる
プログラム等(動画や音声関連?)では、ちょいちょい問題が
発生するケースがあります

僕の場合も、バックグラウンドでコネクションを維持し、切断された
場合も自動で再接続するようなアプリケーションの開発をしていた
んですが、バックグラウンドでAppNapがオンになると、
その状態でコネクションが切断されても、自動で再接続されない
問題にぶち当たりました
(AppNapが原因だとわかるのにずいぶんかかってしまいました。
おそらくアプリケーションの作りによって、回避できる方法もありそうですが。)

AppNapを無効にする

僕が知ってる範囲では、OS全体でAppNapを無効にする
方法はありません。

アプリ単位で設定する必要があります。
(基本的には省メモリ、省電力のためのありがたい機能なので
適宜、必要になったら設定すればOK
かもしれません。MacProとか、iMacみたいに、据え置きで
パフォーマンス重視のマシンでは不便かもしませんが)

Finderから設定する

  1. 対象アプリケーションを終了する
  2. Finderでアプリケーションディレクトリを開く(Finderのショートカット、Command + Shift + AでもOK)
  3. 対象アプリケーションを2本指クリック(マウスなら右クリック)
  4. 情報を表示、をクリック(英語版なら Get Info)
  5. 表示されたウィンドウのAppNapを無効にする、にチェックを入れる(英語版ならPrevent App Nap)

これでOKです。

コマンドラインから設定する

以下のコマンドを実行する。

app domainってなんだ、と思っても安心。
対象のアプリケーションの中身(****.appの中身)のContents/Info.plistに
記載されています。

MacVimであれば以下の手順で確認することができます。

これで表示されるXMLファイルの
CFBundleIdentifierの値が、app domainになります。
(僕の環境にインストールされているMacVimではorg.vim.MacVimでした。)

これでアプリケーションのインストーラー作るときなんかに、インストール後
デフォルトでAppNapをオフとかにもできます。

ちなみに

アップデートなどで、***.appディレクトリの中身が変更されても
設定は保存されます。(少なくとも僕が開発していたアプリの
バージョンアップでは設定は引き継がれていました。)

手動で設定した場合は、一度設定すれば、appディレクトリを
削除するまでは、おおよそ設定は保存されます。

加えて、コマンドラインから設定した場合は
appディレクトリを2本指クリックして情報を表示、をクリックしても
App Napを無効にする、にチェックは入りません。
(でもAppNapは無効になっています。)

AppNapの状態を確認する。

MacOSに標準でインストールされている、アクティビティモニターで
アプリケーションが、現在App Napに処理を抑えられているかどうか
をチェックすることができます。
(あくまで設定が有効か、ではなく、現在AppNapの機能によって制限されているか、だけです。)

アクティビティモニターを起動し、メニューバーの

View > Columns > App Nap

で表示させることができます。
(すいません、これを書いているときに、手元に英語版のMacOSしか
ないため、英語です。日本語版なら、おそらくViewは”表示”になってると思います。)

参考リンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です