Simulator.app の「Stay On Top」をキーボードショートカットで切り替える

この記事は はてなエンジニア Advent Calendar 2023 の 2024年1月15日 の記事です。 developer.hatenastaff.com

Xcode を利用したアプリケーション開発では、実装の確認にシミュレータを利用することが多いかと思います。デバッグの際にはシミュレータと Xcode を交互に行き来することになりますが、コンソールの確認のために Xcode にフォーカスが移すとアプリケーションの Window Level が切り替わり、シミュレータが Xcode の裏に周ってしまうため、再度シミュレータに戻るためにはアプリケーションの切り替え操作が必要になってしまいます。

そこで便利なのが今回紹介する「Stay On Top」というシミュレータを常に最前面に固定するオプションです。

Simulator > Window > Stay On Top

ご存じの方も多いかと思いますが、このオプションを有効にするとシミュレータを起動した状態で他のアプリケーションにフォーカスを切り替えても、シミュレータを前面に配置したままにしてくれます。Breakpoint を設定し lldb を使って変数の確認や操作する際にシミュレータと Xcode の行き来がしやすくなるので大変有用なのですが、いかんせんショートカットキーが割り当てられていないためこのオプションの切り替えが少しコストを感じていました。そこで今回はショートカットキーが割り当てられていない「Stay On Top」の切り替えをキーボードショートカットでできるようにしたいと思います。

AppleScript でメニューのクリックを自動化する

まず、メニューバーにある「Stay On Top」メニューのクリックを AppleScript に担ってもらいます。AppleScriptMac OS/macOSスクリプティング機構 Open Scripting Architecture (OSA) に対応した言語(OSA言語)のひとつで、 macOS でアプリケーション操作の自動化を行うのに最適です。

developer.apple.com

support.apple.com

今回の目的は Simulator.app の「Window」メニュー内にある「Stay On Top」というメニューをクリックすることなので、AppleScript で操作する場合は以下のようになります。

tell application "System Events"
    -- Check Simulator.app is open
    if (count of (processes whose name is "Simulator")) > 0 then
        tell application "Simulator"
            -- Activate Simulator.app
            activate
            -- Toggle 'Stay On Top' from 'Window' on menu bar
            tell application "System Events"
                tell process "Simulator"
                    click menu item "Stay On Top" of menu "Window" of menu bar 1
                end tell
            end tell
        end tell
    end if
end tell

実用上、今回する設定するキーボードショートカットは Simulator.app が起動している際にしか使わないこと、起動していない状態から起動させるようなことはしないことを考慮し if (count of (processes whose name is "Simulator")) > 0 で起動状態をチェックします。

また、実際に表示されているメニューをクリックする必要があるため activate コマンドでアプリケーションにフォーカスします。そうすることでメニューバーに Simulator.app のメニューが並んでいる状態を保証することができます。

最後は Window > Stay On Top をクリックさせるという形です。スクリプトが準備できたら Script Editor.app で実際に動かしてみます。

Script Editor.app で AppleScript を動かしてみる
Script Editor.app

スクリプトを走らせてみて実際に「Stay On Top」 オプションの切り替えができていることを確認*1しましょう。

Shortcuts.app で AppleScript を走らせる

先ほどの AppleScript にショートカットキーを割り当てるために Shortcuts.app 経由で実行できるようにします。 AppleScript を動かすには事前に Settings... > Advanced > Allow Running Scripts の設定をしておきます。

Shortcuts.app で AppleScript を動かすには `Allow Running Scripts` が必要
Shortcuts.app で AppleScript を動かすには `Allow Running Scripts` が必要

あとは実行するアプリケーションに Script Editor を選択し、 Run AppleScript を選んで先ほど作ったスクリプトを貼り付けて実行*2します。

Shortcuts.app で AppleScript を実行する
Shortcuts.app で AppleScript を実行する

キーボードショートカットを設定する

最後は任意のショートカットキーを割り当てて完成です。ここで重要なので実際にこのショートカットキーを入力する際に開いているであろうアプリケーション(Xcode や Simulator.app など)が持つショートカットキーと競合させないようにすることです。競合しないものであれば好きなコマンドを割り当ててください。

任意のショートカットキーを割り当てる
任意のショートカットキーを割り当てる

最後に

このようにショートカットキーが割り当てられていないメニューにもキーボードショートカットを追加することは可能です。Xcode を用いたネイティブアプリケーション開発に限らず、シミュレータを用いた開発であれば ReactNative や Flutter などでも利用できそうですね。Xcode では Build Phase / Run Script で AppleScript を実行することもできるので、そういったアプローチもできますが、今回は手っ取り早くショートカットキーで操作できる方法を紹介しました。他にももっといい方法があるぜという方は是非教えてください!

*1:スクリプトやキーボードショートカットを動かす時にアプリケーションに Accessibility Access が必要になるので適宜設定してください

*2:1と同様。