この記事は はてなエンジニア Advent Calendar 2023 の 2024年1月15日 の記事です。 developer.hatenastaff.com
Xcode を利用したアプリケーション開発では、実装の確認にシミュレータを利用することが多いかと思います。デバッグの際にはシミュレータと Xcode を交互に行き来することになりますが、コンソールの確認のために Xcode にフォーカスが移すとアプリケーションの Window Level が切り替わり、シミュレータが Xcode の裏に周ってしまうため、再度シミュレータに戻るためにはアプリケーションの切り替え操作が必要になってしまいます。
そこで便利なのが今回紹介する「Stay On Top」というシミュレータを常に最前面に固定するオプションです。
ご存じの方も多いかと思いますが、このオプションを有効にするとシミュレータを起動した状態で他のアプリケーションにフォーカスを切り替えても、シミュレータを前面に配置したままにしてくれます。Breakpoint を設定し lldb を使って変数の確認や操作する際にシミュレータと Xcode の行き来がしやすくなるので大変有用なのですが、いかんせんショートカットキーが割り当てられていないためこのオプションの切り替えが少しコストを感じていました。そこで今回はショートカットキーが割り当てられていない「Stay On Top」の切り替えをキーボードショートカットでできるようにしたいと思います。
AppleScript でメニューのクリックを自動化する
まず、メニューバーにある「Stay On Top」メニューのクリックを AppleScript に担ってもらいます。AppleScript は Mac OS/macOS のスクリプティング機構 Open Scripting Architecture (OSA) に対応した言語(OSA言語)のひとつで、 macOS でアプリケーション操作の自動化を行うのに最適です。
今回の目的は 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 で実際に動かしてみます。
スクリプトを走らせてみて実際に「Stay On Top」 オプションの切り替えができていることを確認*1しましょう。
Shortcuts.app で AppleScript を走らせる
先ほどの AppleScript にショートカットキーを割り当てるために Shortcuts.app 経由で実行できるようにします。 AppleScript を動かすには事前に Settings...
> Advanced
> Allow Running Scripts
の設定をしておきます。
あとは実行するアプリケーションに Script Editor
を選択し、 Run AppleScript
を選んで先ほど作ったスクリプトを貼り付けて実行*2します。
キーボードショートカットを設定する
最後は任意のショートカットキーを割り当てて完成です。ここで重要なので実際にこのショートカットキーを入力する際に開いているであろうアプリケーション(Xcode や Simulator.app など)が持つショートカットキーと競合させないようにすることです。競合しないものであれば好きなコマンドを割り当ててください。
最後に
このようにショートカットキーが割り当てられていないメニューにもキーボードショートカットを追加することは可能です。Xcode を用いたネイティブアプリケーション開発に限らず、シミュレータを用いた開発であれば ReactNative や Flutter などでも利用できそうですね。Xcode では Build Phase / Run Script で AppleScript を実行することもできるので、そういったアプローチもできますが、今回は手っ取り早くショートカットキーで操作できる方法を紹介しました。他にももっといい方法があるぜという方は是非教えてください!