[MacOS] Sleep / Wakeup への対応方法

MacOS アプリで、Sleep / Wakeup 時に動作する機能の実装方法を説明します。

BecomeActive / ResignActive では捕まえられません

NSApplicationDelegate の関数に、applicationDidBecomeActive と applicationDidResignActive があります。

applicationDidBecomeActive は、アプリケーションがアクティブになった時にコールされる関数です。

applicationDidResignActive は、アプリケーションがアクティブでなくなった時にコールされる関数です。

てっきり、Sleep / Wakeup の前後でも上記の関数が呼び出されると思って実装していたのですが、実際には呼び出されません。

# メニューバーアプリを調査対象としているため、通常アプリでは異なるかもしれません

Sleep 前、Wakeup 後のタイミングでコールされる関数はありません

NSApplicationDelegate をチェクしても、WillSleep や DidWakeup はありません。

なお、NSApplicationDelegate の Apple のドキュメントは、こちら




Sleep / Wakeup 時には、イベントが発行されます

Sleep / Wakeup 時には、イベントが発行されているので、そのイベントを Observe することで、Sleep / Wakeup のタイミングを検知することができます。

NSWorkspace.willSleepNotification

このイベントが、Sleep 前に発行されます。

NSWorkspace.didWakeNotification

このイベントが、Wakeup 後に発行されます。

使用例

Sleep, Wakeup 時にそれぞれの関数を呼び出したいとします。

まずは、関数を定義します。

Sleep 時に呼び出したい関数
Wakeup 時に呼び出したい関数

次に、以下のように、Observer として追加します。

Observer 追加

上記追加は、アプリケーション初期化等の段階で設定します。




Tips: コンソール

上記のコードに、os_log を入れていますが、このログを入れておくことで、Console にログが表示されます。(.default より高優先度をセットしないと記録されません)

Sleep, Wakeup の振る舞いについての動作検証は意外と手間なので、ログ等の仕組みを入れて確認することをお勧めします。

まとめ:MacOS で Sleep, Wakep 時の動作を設定する方法

  • Sleep,Wakeup で動作する機能実装は、NotificationCenterからの通知を受け取る必要あり
  • チェックする通知は、didWakeNotification, willSleepNotification
  • ログで動作確認できるようにしておくと便利

説明は以上です。 




コメントを残す

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